awk は共通列に基づいて 2 つの txt ファイルをマージします。

awk は共通列に基づいて 2 つの txt ファイルをマージします。

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

関連情報