从不同文件中的2个不同列中查找相同的值

时间:2016-05-02 17:45:52

标签: bash shell awk scripting grep

我有2个文件:

FILE1.TXT:

1 A bla 9232
1 B tesfs 3049
1 C blof 4054
2 D dkeeez 3049
2 E eor 4042
3 F foaer 4024

FILE2.TXT:

A
B
E

预期输出,file3.txt:

1 A bla 9232
1 B tesfs 3049
2 E eor 4042

输出只是file1中包含第2列中与file2中相同值的行。

在file2.txt中,每一行都是唯一的,但您可以拥有:

A
AA
AAee
B
...

我尝试使用grep -Ff file2.txt file1.txt,但file3.txt中仍然存在但不存在于file2.txt中的行 解决方案可以是在线或在shell脚本中,我尝试使用" awk"和shell脚本,没有结果......

4 个答案:

答案 0 :(得分:4)

您可以使用awk命令:

private void btnGraphStreamActionPerformed(java.awt.event.ActionEvent evt) 
{                                               
    new Clicks();
}

在第一次迭代中,我们将awk 'FNR==NR{a[$1]; next} $2 in a' file2.txt file1.txt 中的所有值存储到数组file2.txt中。在第二步白色迭代a中,我们检查第2列是否在数组file1.txt中并打印出来。

<强>输出:

a

答案 1 :(得分:1)

如果您的输入已排序(join的字段2和file1.txt的字段1),file2.txt有用的一件事 - 您的示例显示已排序的输入,但如果您的真实输入不是,那么您必须在join工作之前解决这个问题:

join -1 2 -2 1 -o 1.1,1.2,1.3,1.4 file1.txt file2.txt

答案 2 :(得分:0)

我喜欢anubbhava的awk解决方案。这是一个替代解决方案,使用grep:

# Add word anchors before and after each word in file2.txt
sed 's/^/\\b/;s/$/\\b/' file2.txt > temp.txt  

grep -f temp.txt file1.txt
rm temp.txt

文件 temp.txt 如下所示:

\bA\b
\bB\b
\bE\b

接下来,我们将使用 temp.txt 文件作为搜索字词,并获得所需的结果。

答案 3 :(得分:0)

grep + awk版本:

# This will grep the first column of file2.txt in file1.txt. 

grep "`awk '{print $1}' file2.txt`" file1.txt
1 A bla 9232
1 B tesfs 3049
2 E eor 4042

grep + cut version:

# This will grep the first column of file2.txt in file1.txt. 

grep "`cut -d' ' -f1 file2.txt`" file1.txt

1 A bla 9232
1 B tesfs 3049
2 E eor 4042