Cat 2ファイルと重複ラインの防止

Cat 2ファイルと重複ラインの防止

私は持っていますファイル1次の内容が含まれています

{"name":"clio5", "value":"13"}
{"name":"citroen_c4", "value":"23"}
{"name":"citroen_c3", "value":"12"}
{"name":"golf4", "value":"16"}
{"name":"golf3", "value":"8"}

私は持っていますファイル2次の内容が含まれています

{"name":"clio5", "value":"14"}
{"name":"citroen_c4", "value":"25"}
{"name":"golf4", "value":"18"}

内容を表示するためにシェルコマンドを実行したいファイル1そしてファイル2。 aがname両方に存在する場合ファイル1そしてファイル2だから関連行だけを表示したいと思います。ファイル2

したがって、出力は次のようになります。

$command taking account file1 file2
{"name":"clio5", "value":"14"}
{"name":"citroen_c4", "value":"25"}
{"name":"citroen_c3", "value":"12"}
{"name":"golf4", "value":"18"}
{"name":"golf3", "value":"8"}

このコマンドは編集しないでください。ファイル1どちらもありませんファイル2

コマンドはできるだけ簡単でなければなりません。

コマンドにはgrep、、sedawk

答え1

これは行の順序を維持しませんが、必須ではありません。

awk '{line[$1]=$0} END {for (key in line) print line[key]}' file1 file2

答え2

$ awk -F, 'NR==FNR{a[$1]=$0;next};$1 in a {$0=a[$1]}; 1' file2 file1
{"name":"clio5", "value":"14"}
{"name":"citroen_c4", "value":"25"}
{"name":"citroen_c3", "value":"12"}
{"name":"golf4", "value":"18"}
{"name":"golf3", "value":"8"}

これはfile2次のように仮定します。修正するでアイテムを見つけましたfile1。新しい項目を挿入できる場合は、file2次のように変更できます。

awk -F, '
  NR==FNR{a[$1]=$0;next}
  $1 in a {$0=a[$1];delete a[$1]}
  1
  END{for (i in a) print a[i]}' file2 file1

注文する入れる 表示された項目が指定されていません。上記は、アイテムごとに1つのアイテムしかないと仮定しています。名前すべてのファイルに。

答え3

順序が重要でない場合は、次のコマンドを使用できます。

cat file2 file1 > files
cut -f2 -d: files | cut -f1 -d, | sort | uniq > pat
for i in $(cat pat); do grep $i files -m 1; done

最初のコマンドは入力ファイルを連結します(順序が重要です。その値がfile1の値を上書きするため、file2が最初に実行されます)。

2 番目のコマンドは、入力ファイルから車のブランドを切り取り、重複項目をソートして削除し、ファイルに保存しますpat

3番目のコマンドgrepは、入力ファイルの各パターンを組み合わせて最初の一致で停止するため、同じ自動車メーカーが両方のファイルに表示されると、file2のパターンのみが印刷されます。

順序が重要で、すべてのパターンがfile1にある場合は、2番目のコマンドでファイルの代わりにfile1を使用してコマンドsortuniq省略できます。

関連情報