linux - 如何在考虑其他文件的情况下显示文件的内容?

标签 linux bash shell sed awk

我有包含以下内容的file1

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

我有包含以下内容的file2

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

我想执行一个 shell 命令来显示 file1file2 的内容。如果 name 同时存在于 file1file2 中,那么我只想显示 file2 的相关行。

所以输出应该是这样的:

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

该命令不应编辑 file1file2

编辑

file1file2 具有完全相同的内容格式:

{"name":"any", "value":"xx"}

命令越简单越好

命令可以包含grepsedawk

最佳答案

这是 awk 的一种方式:

awk -F"[:,]" '
NR==FNR { name[$2]=$0;next }
($2 in name) { delete name[$2]; print $0 }
END { for (left in name) print name[left] }' file1 file2

测试:

$ head file*
==> file1 <==
{"name":"clio5", "value":"13"}
{"name":"citroen_c4", "value":"23"}
{"name":"citroen_c3", "value":"12"}
{"name":"golf4", "value":"16"}
{"name":"golf3", "value":"8"}

==> file2 <==
{"name":"clio5", "value":"14"}
{"name":"citroen_c4", "value":"25"}
{"name":"golf4", "value":"18"}

$ awk -F"[:,]" '
NR==FNR { name[$2]=$0;next }
($2 in name) { delete name[$2]; print $0 }
END { for (left in name) print name[left] }' file1 file2
{"name":"clio5", "value":"14"}
{"name":"citroen_c4", "value":"25"}
{"name":"golf4", "value":"18"}
{"name":"golf3", "value":"8"}
{"name":"citroen_c3", "value":"12"}

关于linux - 如何在考虑其他文件的情况下显示文件的内容?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/17784369/

相关文章:

java - 从 Linux Cmd 运行 Java 项目

linux - 在某些模式之前添加文本时,在忽略大小写的情况下使用sed

ruby 在 windows shell 中注入(inject)击键

linux - 对每个主机使用自定义参数的并行 SSH

shell - 如何使用 grep 查找包含一个模式但没有第二个模式的所有文件?

linux - WPF 应用程序可以在 Linux 或 Mac 上运行 .Net Core 3 吗?

c++ - 访问静态初始化的 __thread 变量时出现段错误

bash - 如何使用 Robot 框架在 bash 中获取源文件?

linux - Rsync:排除目录内容,但包含目录

OSX 上命令行中的 Javapackager 工具?