как выполнить поиск слов в одном файле относительно другого файла и отобразить первое подходящее слово в строке - PullRequest
0 голосов
/ 14 апреля 2019

У меня раздражающая проблема.У меня есть два файла.

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

Файл 1 - это файл списка слов, тогда как файл2 - это файл, содержащий различное количество столбцов.Я хочу выполнить поиск, используя файл 1 против file2, отобразить все возможные первые подходящие слова, которые появляются в каждой строке файла file2.Таким образом, результат должен быть следующим:

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 ]

2 голосов
/ 14 апреля 2019

Похоже, вы хотите первое совпадение из каждой строки:

$ 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 голос
/ 15 апреля 2019

Кажется, что grep можно заставить работать

grep -nof f1 f2 | sort -u
1:Sam
2:Tom
3:Tom
4:Sam
4:Tom
5:Sam
5:Tom
6:Sam
1 голос
/ 14 апреля 2019

с GNU awk для sorted_in:

$ 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)
1 голос
/ 14 апреля 2019

Не могли бы вы попробовать и сообщите мне, поможет ли это вам.

awk -F"[. ]" 'FNR==NR{a[$0];next} {for(i=1;i<=NF;i++){if($i in a){print $i;next}}}'  Input_file1   Input_file2
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...