首页 > 解决方案 > Bash 文本处理

问题描述

我有三个文件file1file2exl. 两者file1都有列内容file2。两个文件中的第一列相同。

我想使用该列加入两个文件的内容。join使用命令很容易。但是文件有一个问题exl:它包含一些单词,我希望join命令忽略/删除这些单词。

有什么办法可以做到这一点,join或者我应该使用它awk吗?

文件1:

A la  
B lb  
C lc  
D something  

文件2:

A ba  
B bb  
C another  
D bd  

外:

something  
nothing  

预期结果:

A la ba  
B lb bb  
C lc  
D bd  

标签: bashawk

解决方案


gjoin -t $'\t' <(gjoin -t $'\t' -v 1 file1 exl) <(gjoin -t $'\t' -v 1 file2 exl)

(对于我的设置,安装了 GNU 工具并使用制表符分隔值的 Mac OS X;根据您的情况进行更改。)

<(...)构造将命令的输出设置为外部命令行可以接受作为参数的虚拟文件。

-v 1参数的意思join是:“打印第一个文件中不可连接的所有行”。

因此,gjoin -t $'\t' -v 1 file1 exl将尝试将第一个文件加入排除列表,并且只打印那些不在排除列表中的文件。同样对于file2

然后我们将这两个负连接的输出带到真正的连接中。


推荐阅读