如何获取特定列中具有所需值之一的行?

如何获取特定列中具有所需值之一的行?

有没有一种方法可以获取在特定列中具有所需值之一的行。例如,如果有一个这样的文件

12 a 4
11 f 5
8  b 6
10 x 7

另一个包含值列表的文件,例如

a
b
x

有没有办法只获取文件 1 中第二列中具有文件 2 的值之一的行。就像在本例中一样,输出应该是:

12 a 4
8 b 6
10 x 7

提前致谢。我的文件是制表符分隔的。

答案1

给定

$ cat file1 
12      a       4
11      f       5
8       b       6
10      x       7

$ cat file2 
a
b
x

您可以使用简短的 AWK 脚本:

$ awk 'FNR == NR {strings[$0]} NR > FNR && ($2 in strings)' ./file2 ./file1
12      a       4
8       b       6
10      x       7

第一个模式 ( FNR == NR) 仅适用于file2(命令行上的第一个文件参数);相应的操作填充一个关联数组,其索引是要匹配的字符串。

第二个模式 ( NR > FNR && ($2 in strings)) 仅适用于来自file1(以及来自命令行上可能遵循的任何其他文件)的行,如果第二列是数组的索引strings。对应的动作省略,默认为print

为了允许查找的字符串也包含空格,假设 中的列file1由单个 分隔<tab>,您可以将-v FS='\t'(或-F '\t') 选项添加到您awk的调用中。

答案2

用这个:

grep -wf file2 file1

匹配f文件 2 的内容,并且将w确保只有与文件 2 的内容匹配的整个单词才与文件 1 的内容相匹配,这样像aaandab和 之类的字符串apple就不会匹配。

使用 GNU grep 验证。

答案3

对于 中的 3 个字段file1.txt以及来自 的单字符匹配file2.txt

chars="$( tr -d "\n" <file2.txt)"
regexp="\t[$chars]\t"
eval grep -E "$regexp" file1.txt

未经测试

相关内容