grep обратный шаблон соответствия чтения из двух файлов - PullRequest
0 голосов
/ 30 мая 2020

У меня есть файл (обратите внимание, что некоторые строки содержат более 2 столбцов, также некоторые строки разделены одним пробелом, а некоторые - несколькими пробелами, этот файл довольно большой ...)

 file1.txt:
there is a line here that has more than two columns
## this line is a comment
blahblah:     blahblahSierraexample7272
foo: foo@foobar.com
nonsense:                    nonsense59s59S
nonsense:   someRandomColumn
.....

У меня есть другой файл, который является подмножеством file1.txt, в этом файле есть только два столбца, а столбцы разделены пробелами «1»!

file2.txt
foo: foo@foo.com
nonsense: nonsense59s59S

Теперь я хотел бы удалить все строки, которые появляются file2.txt из file1.txt, как я могу сделать это в сценарии оболочки? обратите внимание, что второй файл (file2.txt) имеет только два столбца, а file1.txt - несколько ... поэтому, если необходимо выполнить сопоставление, оно должно быть таким: $1(from file2) match $1(from file1) и $NF(from file2) match $NF(from file1), а затем инвертировать сопоставление и print ...

PS уже пробовал grep -vf file2.txt file1.txt, но поскольку пространство между column1 и $ NF не исправлено, это не сработало ... sed и awk должны сделать трюк, но не могут придумать код ...

sed -i '/^<firstColumnOfFile2> .* <lastColumnOfFile2>$/d' file1.txt (perhaps in a while loop!)

или что-то вроде: grep -vw -f ^[(1stColofFile2)] and also [(lastColOfFile2)]$ file1.txt

Ответы [ 2 ]

0 голосов
/ 30 мая 2020
$ awk 'NR==FNR{a[$0]; next} {orig=$0; $1=$1} !($0 in a){print orig}' file2 file1
there is a line here that has more than two columns
## this line is a comment
blahblah:     blahblahSierraexample7272
foo: foo@foobar.com
nonsense:   someRandomColumn
.....
0 голосов
/ 30 мая 2020

Вы можете использовать sed, чтобы превратить строки в file2.txt в регулярные выражения, которые соответствуют одному или нескольким пробелам после двоеточия, а затем используйте grep, чтобы удалить строки из file1.txt, которые соответствуют этим:

$ grep -Evf <(sed 's/^\([^:]*\): /^\1:[[:space:]]+/' file2.txt) file1.txt
there is a line here that has more than two columns
## this line is a comment
blahblah:     blahblahSierraexample7272
foo: foo@foobar.com
nonsense:   someRandomColumn
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...