awkを使用して、一致する列に基づいて2つのファイルをマージしたいと思います。
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
私にどんな提案がありますか?ありがとうございます!
答え1
いくつかの調整を行うだけで、慎重な実験で目的の結果を得ることができます。希望する最初の結果を得るには
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
答え2
使用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を2番目のファイルの列6と組み合わせます。
csvformat
オプション:
-K 1
コマンドで追加された最初のヘッダー行を削除しますcsvjoin
。
-T
区切り記号をからに変更comma
しますtab
。