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"}

我想执行一个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(而不是文件)并省略sortuniq命令。

相关内容