Text-Processing
使用第一列合併兩個文件
我有兩個不同的文件,我想使用第一列合併它們的資訊。
文件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
(不是我的腳本)join
,grep
但沒有得到想要的結果。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
根據每個文件的第一行來填充每行中的欄位數(預設情況下,它會使用-e
option 的值填充缺失的欄位,預設情況下它是空格字元,但您可以將其更改為您想要的任何字元串);$ 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
從文件號列印第k
th欄位#
。
-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()
將行刪除到第一個逗號字元來刪除該列,因此剩餘內容將是該鍵的值以供以後使用。