2つのファイルの一致するIDを2つのファイルの別の列に関連付けます。

2つのファイルの一致するIDを2つのファイルの別の列に関連付けます。

ファイルAのIDをファイルBと一致させ、2つのファイルに属する列を持つ3番目のファイルに保存したいと思います。私は私が見つけたほとんどすべてのawksを試しましたが、なぜかうまくいきません。ご協力ありがとうございます!

fileA:

id;name
1;"sam"
4;"jon"

fileB:

id;surname
5;"smith"
1;"khon"

file3:

id;name;surname
1;"sam";"khon"

答え1

通常、これが作業になりますjoin。ただし、join入力はソートする必要があり、sort私が知っているすべてのロケールで文字の前に数字を付ける必要があります(実際にはそうでない場合は訂正してください)。したがって、joinそれらの一部だけがそこに到達することができます。

$ join -t';' <(sort fileA) <(sort fileB)
1;"sam";"khon"
id;name;surname

各ファイルの最初の行を最初にリンクしてから、残りの行をリンクすることでこの問題を解決できます。

$ join -t';' <(head -n1 fileA) <(head -n1 fileB)
id;name;surname
$ join -t';' <(tail -n+2 fileA | sort) <(tail -n+2 fileB | sort)
1;"sam";"khon"

その後、それをサブシェルにグループ化して出力をリダイレクトすると、目的の出力が得られます。

 $ ( join -t';' <(head -n1 fileA) <(head -n1 fileB); join -t';' <(tail -n+2 fileA | sort) <(tail -n+2 fileB | sort))
id;name;surname
1;"sam";"khon"

だからあなたはこれを行うことができます:

( 
    join -t';' <(head -n1 fileA) <(head -n1 fileB); 
    join -t';' <(tail -n+2 fileA | sort) <(tail -n+2 fileB | sort)
) > file3

または、実際には次のことができますawk

$ awk -F';' '(NR==FNR){data[$1]=$1";"$2; next} 
             ($1 in data){print data[$1]";"$2}' fileA fileB 
id;name;surname
1;"sam";"khon"

答え2

ミラーの使用(https://github.com/johnkerl/miller)と実行

mlr --csv --fs ";" join -j id -f fileA.csv fileB.csv >file3.csv

あなたは

+----+------+---------+
| id | name | surname |
+----+------+---------+
| 1  | sam  | khon    |
+----+------+---------+

いくつかの注意:

  • --fsフィールド区切り記号を設定します。
  • -j接続フィールドを設定します。

関連情報