ファイル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
接続フィールドを設定します。