Скрипт awk для удаления одной записи, а не только группы записей - PullRequest
1 голос
/ 02 декабря 2011

У меня есть команда awk, которая выводит записи, отсутствующие в $ NEWFILE, но найденные в $ OLDFILE:

awk -F "|" 'NR==FNR{a[$4]++}!a[$4]' $NEWFILE $OLDFILE > $OUTFILE

Эта команда прекрасно работает, когда все записи для объекта, имеющего уникальный идентификатор, не найдены в $ NEWFILE,Однако он завершается неудачно, когда из $ NEWFILE была удалена только одна запись для сущности, но не все.

У любого есть предложение о том, как настроить эту команду awk для вывода всех записей, отсутствующих в $ NEWFILE.но находится в $ OLDFILE, независимо от того, удаляются ли все записи для сущности?

Пример данных: newfile , oldfile

Ответы [ 4 ]

2 голосов
/ 02 декабря 2011

Коротко и сладко: используйте diff. Вы можете diff oldfile newfile | grep '^< ' | cut -b3- ограничить вывод тем, что вы хотите.

0 голосов
/ 02 декабря 2011

Вы должны использовать awk? Можем ли мы просто использовать join вместо этого, что на самом деле вы здесь делаете, нет?

$join -v2 -t'|' -j4 <(sort -t'|' -k4 newfile) <(sort -t'|' -k4 oldfile ) |tee outfile
P-1-01541|22|Professor|University of Alabama at Birmingham|http://www.uab.edu/
P-1-01541|22|Short-Term Scholar|University of Alabama at Birmingham|http://www.uab.edu/

Это, конечно, предполагает, что вы присоединяетесь к столбцу 4, и, как и большинство элементарных объединений, которые вы не хотите повторять, сначала их нужно отсортировать.

0 голосов
/ 02 декабря 2011

Если я правильно вас понимаю, это то, что вы хотите

awk -F "|" 'NR==FNR{a[$1 $2 $3 $4]++}!a[$1 $2 $3 $4]' NEWFILE OLDFILE > OUTFILE

Поскольку NEWFILE не содержит URL-адреса в OLDFILE уникальный идентификатор строки является составной из четырех первых полей,Потому что NEWFILE не имеет этих URL, простой diff не подойдет.

0 голосов
/ 02 декабря 2011

AWK - это построчный интерпретатор, который является причиной удаления только одной строки, а других - на месте.Вы можете сделать две вещи:

  • Если можете, отфильтруйте с помощью выражения, которое является общим для строк.
  • Для каждой строки нового файла запустите цикл for, который будет повторять oldfile исделайте операцию за вас.
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...