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"

おすすめ記事