Awk
通過 awk 基於公共列合併兩個 txt 文件
我想使用 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
將分隔符從 更改comma
為tab
。