私は持っていますファイル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
、、sed
awk
答え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を使用してコマンドsort
をuniq
省略できます。