Несоответствующее слово из файла1 в файл2 - PullRequest
0 голосов
/ 19 февраля 2019

У меня есть два файла - файл1 и файл2.file1 содержит (только слова) говорит-

ABC
YUI
GHJ
I8O

..................

file2 содержит много пунктов.

dfghjo ABC kll njjgg bla bla 
GHJ njhjckhv chasjvackvh ..
ihbjhi hbhibb jh jbiibi

...................

Я использую приведенную ниже команду, чтобы получить соответствующие строки, содержащие слово из файла1 в файле2

 grep -Ff file1 file2
(Gives output of lines where words of file1 found in file2)

Мне также нужны слова, которые не совпадают / не найдены в файле 2 и не могут найти несоответствующее слово.

Может ли кто-нибудь помочь получить результат ниже

YUI
I8O

Я ищу одну команду лайнера (через grep, awk, sed), так как я использую команду pssh и не могу использовать while,для петли

Ответы [ 4 ]

0 голосов
/ 20 февраля 2019

Использование Perl - оба совпали / не совпали в одной и той же строке

$ cat sinw.txt
ABC
YUI
GHJ
I8O

$ cat sin_in.txt
dfghjo ABC kll njjgg bla bla
GHJ njhjckhv chasjvackvh ..
ihbjhi hbhibb jh jbiibi

$ perl -lne '
    BEGIN { %x=map{chomp;$_=>1} qx(cat sinw.txt); $w="\\b".join("\|",keys %x)."\\b"} 
    print "$&" and delete($x{$&}) if /$w/ ; 
    END { print "\nnon-matched\n".join("\n", keys %x) } 
' sin_in.txt

ABC
GHJ

non-matched
I8O
YUI

$

Получение только несопоставленного

$ perl -lne ' 
    BEGIN { 
        %x = map { chomp; $_=>1 } qx(cat sinw.txt); 
        $w = "\\b" . join("\|",keys %x) . "\\b" 
    } 
    delete($x{$&}) if /$w/;
    END { print "\nnon-matched\n".join("\n", keys %x) } 
' sin_in.txt

non-matched
I8O
YUI

$

Обратите внимание, что даже одноразовое использование $ & variable раньше был очень дорогим для всей программы, в версиях Perl до 5.20 .

0 голосов
/ 19 февраля 2019

Для Несоответствующие слова , вот одно решение GNU awk:

awk 'NR==FNR{a[$0];next} !($1 in a)' RS='[ \n]' file2 file1
YUI
I8O

или !($0 in a), то же самое.Так как я установил RS='[ \n]', каждый пробел также разделяется как line .

И обратите внимание, что сначала я читаю file2, а затем file1.

Если file2 может быть пустым,Вы должны изменить NR==FNR на другие методы проверки файлов, такие как ARGIND==1 для GNU awk, или FILENAME=="file2", или FILENAME==ARGV[1] и т. д.

Тот же механизм для только соответствующий тоже:

awk 'NR==FNR{a[$0];next} $0 in a' RS='[ \n]' file2 file1
ABC
GHJ
0 голосов
/ 19 февраля 2019

Вы можете распечатать только совпадающие детали с помощью -o.

$ grep -oFf file1 file2
ABC
GHJ

Используйте этот вывод в качестве списка шаблонов для поиска в файле1.Подстановка процесса <(cmd) имитирует файл, содержащий выходные данные cmd-v вы можете печатать строки, которые не совпадают.Если file1 содержит две строки, так что одна строка является подстрокой другой строки, вы можете добавить -x (только совпадать с целыми строками), чтобы избежать ложных срабатываний.

$ grep -vxFf <(grep -oFf file1 file2) file1
YUI
I8O
0 голосов
/ 19 февраля 2019

Предполагая, что ваши "слова" в файле1 находятся в более чем 1 строке:

  while read line 
  do 
    for word in $line  
    do 
       if ! grep -q $word file2
         then echo $word not found 
       fi 
    done 
  done < file1
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...