shell - 当第一个文件的模式出现在另一个文件中时,如何在新列中打印行号?
问题描述
如果我的信息格式不正确,我是新来的,非常抱歉。
我有几个文件,file1 仅包括参考模式,其他文件包括各种信息。我想在新列中恢复行号,其中 file1 的模式出现在其他文件中。如果可能的话,我希望相应的文件名包含在标题中。
最后,我希望从最终输出中删除所有缺少值的行。
文件1:
Entry
abc
def
ghi
jkl
mno
xyz
文件2:
line1: red|31000|ghi
line2: purple|25640|mno
line3: yellow|9560|abc
line12: blue|2630|def
line120: white|1|xyz
文件3:
line1: blue|144009|def
line2: red|100000|ghi
line3: purple|60500|mno
line52: white|2|xyz
预期的最终输出:
Entry|file2|file3
def|12|1
ghi|1|2
mno|2|3
xyz|120|52
我想有一个使用 awk 的解决方案,但我不能自己处理它(对不起)。我尝试使用 grep ,我知道它可以打印行号并比较几个文件,但这可能不是一个好的选择,因为它最初打印了第二个文件。
grep -Fnf file1 file2 > output
非常感谢您的帮助!
解决方案
使用 GNU join、GNU sort、GNU awk 和 bash:
join -t '|' -j 4 <(awk 'BEGIN{FS=OFS="|"} {print NR,$0}' file2 | sort -t '|' -k4) <(awk 'BEGIN{FS=OFS="|"} {print NR,$0}' file3 | sort -t '|' -k4) -o 1.4,1.1,2.1
推荐阅读
- python - ValueError:输入张量必须至少具有 5 级(depthwise_conv2d)
- hazelcast - Hazelcast 大容量最佳实践
- mysql - 使用 groupby 和 union all 时有没有办法返回不存在的值?
- sql - 根据多个真实条件查询所有相同的id
- reactjs - 无法在反应中更改标签
- java - Spring Boot/Java 的 LINQ 实现
- css - 使用 Wordpress 中的字体添加“预加载”
- wordpress - 如何在 Magento Docker 容器上持久化安装?
- node.js - 如何使用无服务器 AWS 进行跨应用程序
- angular - Angular 9 中未加载单个 spa 角度 i18n 文件