Мне нужно перекрыть два файла .txt, удаляя общие строки - PullRequest
1 голос
/ 02 июля 2019

У меня есть 2 набора данных, мне нужно перекрыть их, чтобы получить окончательный список необходимых прогонов

Я пробовал grep и awk 'NR==FNR{...}!a[$0]', но это не дает мне правильный вывод

grep -vf goodruns.txt idontneed.txt

и

awk 'NR==FNR{a[$0]=1;next}!a[$0]'

input: goodruns.txt со списком номеров:

09987
09989
09991
09995
09996

idontneed.txt со списком номеров:

09987
09988
09991
09993
09995
09997

желаемый вывод:

09989
09997

Ответы [ 3 ]

1 голос
/ 02 июля 2019

Если вам нужен список строк, которые существуют в goodruns.txt и которые не существуют в idontneed.txt, это именно то, для чего comm предназначен.

Решение с использованием bash, sort и comm может быть:

comm -2 -3 <(sort goodruns.txt) <(sort idontneed.txt)

Если вы предпочитаете использовать awk или grep, они будут работать нормально, если вы просто перевернете файлы:

grep -vf idontneed.txt goodruns.txt

awk 'NR==FNR{a[$0]=1;next}!a[$0]' idontneed.txt goodruns.txt
0 голосов
/ 02 июля 2019

Ваш awk работает нормально, просто убедитесь, что у вас idontneed первый

awk 'NR==FNR{a[$0]=1;next} !a[$0]' idontneed.txt goodruns.txt
09989
09996
0 голосов
/ 02 июля 2019

Ваш вопрос мне не совсем понятен, но при условии: а) вам нужны только строки из первого файла, которых нет во втором файле, и б) ваш ожидаемый результат неверен, потому что 09997 не отображается вgoodruns.txt и это должно быть 09996, что:

$ join -v1 goodruns.txt idontneed.txt
09989
09996

Для этого требуется, чтобы ваши файлы были отсортированы, то есть ваши образцы.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...