比较并获取不同文件的两列中的单词

比较并获取不同文件的两列中的单词

我想比较不同文件的两个不同列并获取其中的公共条目:

文件1

abc
123
ttt
kkk

文件2

111 wed
222 kad
333 ttt
444 kkk

我想比较第 1 列文件1到第 2 列文件2。如果有任何常见条目,我想打印 file2 中的匹配行:

预期结果:

333 ttt
444 kkk

我已尝试以下命令来获取结果:

awk -F 'NR==FNR{c[$1$2]++;next};c[$1$2] > 0' file1 file2

或者

join -t -1 1 -2 2 -o 2.1,2.2 file1 file2

但我没有得到预期的结果。

答案1

awk 'NR==FNR {a[$1]; next} $2 in a' file1 file2
333 ttt
444 kkk

以上就是你想要的:to compare column 1 of file1 to column 2 of file2. If there are any common entries, I want to print the match lines from file2

答案2

awk失败了,因为您使用两个字段作为键,但您file1只有一个字段,因此这两个字段永远不会出现在c数组中。另外,您正在使用-F提供字段分隔符的选项,但实际上并未提供字段分隔符。这意味着字段分隔符将是 awk 脚本本身:

awk -F 'script' file

这是您尝试的工作版本awk

$ awk  'NR==FNR{c[$1]++;next};c[$2] ' file1 file2
333 ttt
444 kkk

这是一个更高效的版本,不会使用超出所需的内存:

$ awk  'NR==FNR{c[$1]}; $2 in c' file1 file2 
333 ttt                 
444 kkk   

join也误用了该-t选项。就像 of 一样-Fawkthe-t也需要一个参数,但你没有给它一个参数。接下来,join要求对输入进行排序。这是您的方法的工作版本join

$ join  -1 1 -2 2 -o 2.1,2.2 <(sort file1) <(sort -k2 file2)
444 kkk
333 ttt

答案3

使用csvjoin(工具集的一部分csvkit):

假设 file1 为:

x
abc
123
ttt
kkk

和 file2 为:

y x
111 wed
222 kad
333 ttt
444 kkk

下面的命令可以做到:

csvjoin -d' ' -c x file{2,1} | tr ',' ' '
  • -d' '使用空格作为分隔符。

  • -c xcsvjoin 将使用 column 连接文件x

正如 @terdon 修复了没有标题的文件的上述命令。该命令可以更改为:

csvjoin -H -d ' ' -c 2,1 fil{2,1} | tr ',' ' ' | tail -n +2

上面的命令适用于没有标题(-H参数)的文件。

命令tail从第二条记录()开始输出+2。这是因为csvjoin命令在输出开始处添加了一个新的标题行。

答案4

#!/usr/bin/python
k1=open('file1','r')
for f1 in k1:
    k2=open('file2','r')
    for f2 in k2:
        if f1.strip() in f2.strip():
            print f2.strip()
~                                  

输出

333 ttt
444 kkk

相关内容