有没有一种方法可以获取在特定列中具有所需值之一的行。例如,如果有一个这样的文件
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 的内容相匹配,这样像aa
andab
和 之类的字符串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
未经测试