如果我有许多如下文件:
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
获取包含在一行中的所有行的最佳方法是什么两个都 file2
和file3
?
在这个例子中,它只是:
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
和。file2
file1
file2
然后所有这一切都再次与 结合在一起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 中搜索返回的模式。