我想比较不同文件的两个不同列并获取其中的公共条目:
文件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 一样-F
,awk
the-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 x
csvjoin 将使用 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