Awk

通過 awk 基於公共列合併兩個 txt 文件

  • November 9, 2022

我想使用 awk 根據匹配列合併兩個文件

b.txt(由製表符分隔)

A
B
C
D
C
C
E
G

a.txt(由製表符分隔)

1       2       2       4       19      A
2       2       3       3       12      B
3       2       9       2       5       C
4       3       8       0       9       D
5       5       4       1       1       E

然後我執行腳本

awk -F"\t" 'BEGIN{OFS="\t"} {if (NR==FNR) {a[$NF]=$0; next} if ($NF in a) {print a[$1]}}' a.txt b.txt > c.txt

我得到這樣的 c.txt

1   2   2   4   19  A
2   2   3   3   12  B
3   2   9   2   5   C
4   3   8   0   9   D
3   2   9   2   5   C
3   2   9   2   5   C
5   5   4   1   1   E

實際上,我想要的輸出是

1   2   2   4   19  A
2   2   3   3   12  B
3   2   9   2   5   C
4   3   8   0   9   D
3   2   9   2   5   C
3   2   9   2   5   C
5   5   4   1   1   E
                   G

或者

A   1   2   2   4   19  
B   2   2   3   3   12  
C   3   2   9   2   5   
D   4   3   8   0   9   
C   3   2   9   2   5   
C   3   2   9   2   5   
E   5   5   4   1   1   
G

對我有什麼建議嗎?欣賞它!

通過一些調整,可以從您精心製作的嘗試中獲得所需的結果。為了得到第一個想要的結果,

awk -F"\t" '
 BEGIN { OFS = FS } 
 NR == FNR { a[$NF] = $0; pos = NF; next }
 { if ( $NF in a ) { $NF = a[$1]; } else { $pos = $1; $1 = ""; } } 1
' a.txt b.txt 

使用csvjoin

$ csvjoin -H --tabs --left -c 1,6 b.txt a.txt | csvformat -K 1 -T

-H: 輸入tsv文件沒有標題行。

--tsbs-t:輸入文件被tab分隔。

--left執行完全外連接。

-c 1,6通過第一個文件的第 1 列與第二個文件的第 6 列連接。

csvformat選項:

-K 1刪除csvjoin命令添加的第一個標題行。

-T將分隔符從 更改commatab

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