在(多个)文件中查找包含输入文件中给定行的行

在(多个)文件中查找包含输入文件中给定行的行

如果我有许多如下文件:

file1:

123
456
789
012

file2:

line1  922
line2  392
line3  456
line5  291
line6  201
...

file3:

line1  111
line2  123
line3  19
line5  542
line6  456
...

file1获取包含在一行中的所有行的最佳方法是什么两个都 file2file3

在这个例子中,它只是:

456

答案1

grep -of file1 file2|xargs -I {} grep -o "{}" file3

首先获取 file1 的输入并将其逐行输入到 file2 中,返回完全匹配的文本(如果有)。然后,如果有结果,则再次将其逐行送入 file3,仅返回匹配的文本。

答案2

您可以join连续使用 2 次:

join -1 1 -2 2 -o 1.1 <(join -1 1 -2 2 <(sort file1) <(sort -k2 file2)) <(sort -k2 file3)

仅打印:

465

先看内在join。它通过使用 中的字段 1和 中的字段 2连接file1和。file2file1file2

然后所有这一切都再次与 结合在一起file3。请注意,文件必须按连接字段 ( sort -k) 排序。

答案3

also(){
    sed 'h;                    #save a copy of the line before edits
         s/[]$\./*^[]/\\&/g;   #literally quote any metachars
         s|.*|/&/c\\|p;        #print first half of sed command
         g;                    #get original copy out of hold space
         s/\\/&&/g;' |         #double-up backslashes
    sed  -nf - -- "$@"         #read stdin script -file
}

该函数将模式文件作为标准输入,将一个或多个搜索文件作为参数。它将其模式文件中可在其搜索文件中匹配的任何行写入其输出。每次都小心翼翼地准确再现原件。因为它是,所以您可以递归地使用它。

also <file1 file2 | also file3

456

答案4

grep 应该足以满足您的解决方案

 grep -o "`grep -of file1 file2`" file3

内部 grep " grep -f file1 file2" 将 grep file1 和 file2 中存在的模式,并在 file3 中搜索返回的模式。

相关内容