如何针对另一个文件在一个文件中搜索单词并在一行中显示第一个匹配的单词

时间:2019-04-14 15:15:14

标签: awk grep

我有一个烦人的问题。我有两个文件。

$ cat file1
Sam
Tom
$ cat file2
I am Sam. Sam I am.
Tom
I am Tom. Tom I am.

文件1是单词列表文件,而文件2是包含不同列数的文件。我想对文件2使用文件1进行搜索,显示所有可能出现在文件2每一行的第一个匹配词。因此结果需要为以下内容:

Sam (line 1 match)
Tom (line 2 match)
Tom (line 3 match)

如果f2以下,

I am Sam. Sam I am.
Tom
I am Tom. Tom I am.
I am Tom. Sam I am.
I am Sam. Tom I am.
I am Sammy.

它需要显示以下内容:

Sam (1st line match)
Tom (2nd line match)
Tom (3rd line match)
Tom (4th line match)
Sam (4th line match)
Sam (5th line match)
Tom (5th line match)
Sam (6th line match)

我认为我需要awk解决方案,因为命令“ grep -f file1 file2”将不起作用。

4 个答案:

答案 0 :(得分:2)

似乎您想从每一行中首先进行匹配:

$ cat f1
Sam
Tom
$ cat f2
I am Sam. Sam I am.
Tom
I am Tom. Tom I am.
I am Tom. Sam I am.
I am Sam. Tom I am.

$ grep -Fnof f1 f2 | sort -t: -u -k1,1n
1:Sam
2:Tom
3:Tom
4:Tom
5:Sam
  • -n选项显示行号,以后将其用于删除重复项
  • -F选项可按字面意义而不是正则表达式来匹配搜索项
  • -o仅显示匹配的字词
  • 将输出通过管道传递到cut -d: --complement -f1,以删除行号的第一列

答案 1 :(得分:1)

能否请您尝试以下操作,如果有帮助,请告诉我。

awk -F"[. ]" 'FNR==NR{a[$0];next} {for(i=1;i<=NF;i++){if($i in a){print $i;next}}}'  Input_file1   Input_file2

答案 2 :(得分:1)

使用sorted_in的GNU awk:

$ cat tst.awk
BEGIN { PROCINFO["sorted_in"] = "@val_num_asc" }
NR==FNR { res[$0]; next }
{
    delete found
    for ( re in res ) {
        if ( !(re in found) ) {
            if ( match($0,re) ) {
                found[re] = RSTART
            }
        }
    }
    for ( re in found ) {
        printf "%s (line #%d match)\n", re, FNR
    }
}

$ awk -f tst.awk file1 file2
Sam (line #1 match)
Tom (line #2 match)
Tom (line #3 match)
Tom (line #4 match)
Sam (line #4 match)
Sam (line #5 match)
Tom (line #5 match)
Sam (line #6 match)

答案 3 :(得分:1)

似乎可以使grep正常工作

grep -nof f1 f2 | sort -u
1:Sam
2:Tom
3:Tom
4:Sam
4:Tom
5:Sam
5:Tom
6:Sam
相关问题