Text-Processing

使用第一列合併兩個文件

  • February 3, 2022

我有兩個不同的文件,我想使用第一列合併它們的資訊。

文件1.txt

A,info1,info2
234,info3,info4
CD,info5,info6

文件2.txt

234,ccc,bb
CD,aaa,dd

預期輸出.csv

A,info1,info2,,
234,info3,info4,ccc,bb
CD,info5,info6,aaa,dd

我嘗試了awk(不是我的腳本)joingrep但沒有得到想要的結果。

awk -F "," 'FNR==NR {h[$1] = $2;next} BEGIN{ OFS = "\t"} {print $0,$2?h[$1]:"0"}' file1.txt prova2.txt

join -a 1 <(sort file1.txt) <( sort file2.txt) > output.csv

有人可以幫我嗎?

如果兩個文件中的欄位數相同,那麼您可以使用-o auto根據每個文件的第一行來填充每行中的欄位數(預設情況下,它會使用-eoption 的值填充缺失的欄位,預設情況下它是空格字元,但您可以將其更改為您想要的任何字元串);

$ join -t, -a1 -o auto <(sort file1) <(sort file2)
234,info3,info4,ccc,bb
A,info1,info2,,
CD,info5,info6,aaa,dd

我們還添加-t,了指定輸入 &ouptut 文件的欄位分隔符。

如果要添加僅存在於 file2 中的行,請添加-a2到命令中。

以上命令是以下命令的縮寫版本,我們明確說明要輸出哪些欄位:

join -t, -a1 -o0,1.2,1.3,2.2,2.3 <(sort file1) <(sort file2)

-o #.k從文件號列印第kth欄位#

-o 0這裡輸出不可配對的行。


或使用awk

awk 'BEGIN{ FS=OFS=","; na="" }
             { key=$1; sub(/[^,]*,/, "") }
NR==FNR       { file1[key]=$0; next }
(key in file1){ print key, file1[key], $0; delete file1[key] }

END{ for(key in file1) print key, file1[key], na, na }' file1 file2

在該{ key=$1; sub(/[^,]*,/, "") }操作中,我們從第一列進行備份,然後通過sub()將行刪除到第一個逗號字元來刪除該列,因此剩餘內容將是該的值以供以後使用。

引用自:https://unix.stackexchange.com/questions/689052