我有文件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"}
我想执行一个shell命令来显示内容文件1和文件2。如果aname
同时存在于两者中文件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
的顺序插入 显示的条目未指定。上面假设每个条目只有一个条目姓名在每个文件中。
答案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
第一个命令连接输入文件(顺序很重要;file2 首先执行,因为它的值将覆盖 file1 中的值)。
第二个命令从输入文件中剪切汽车品牌,排序并删除重复项,然后将它们存储在pat
文件中。
第三个命令 grep 组合输入文件上的每个模式并在第一个匹配处停止,因此如果两个文件中出现相同的汽车品牌,则仅打印 file2 中的那个。
如果顺序很重要并且所有模式都在 file1 中,则可以在第二个命令中仅使用 file1(而不是文件)并省略sort
和uniq
命令。