Сравните DSV с awk и удалите различия, переписав входной файл - PullRequest
1 голос
/ 30 ноября 2011

Я пишу сценарий bash, в котором, помимо прочего, сравниваются два файла значений с разделителями канала $ OLDFILE и $ NEWFILE.

Мне удалось добавить любые записи только в $ NEWFILE в $ OLDFILE с помощью следующего оператора awk:

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

Однако я также хочу удалить любые записи в $OLDFILE, которые не находятся в $ NEWFILE после первого запуска выше.Я надеялся, что смогу сделать это с помощью чего-то вроде:

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

Я думал, что это сравнит $ OLDFILE с $ NEWFILE и перезапишет $ OLDFILE только с соответствующими строками, но awk добавляет вывод$ OLDFILE вместо перезаписи.

Чего мне не хватает?

Я открыт для лучшего способа сделать это, если у кого-нибудь есть предложение.

Ответы [ 2 ]

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

Спасибо всем за ваш вклад. Наконец-то я смог достичь этого с помощью смеси моего первоначального подхода и использования comm, как это было предложено @Sorpigal. Вот мое решение для потомков.

# This appends new entries from $NEWFILE to the end of $OLDFILE
awk -F "|" 'NR==FNR{a[$4]++}!a[$4]' $OLDFILE $NEWFILE >> $OLDFILE

# This pulls out entries that are NOT in $NEWFILE but are in 
# $OLDFILE and should be deleted. It then outputs the entries to be 
# deleted to the $OUTFILE.
awk -F "|" 'NR==FNR{a[$4]++}!a[$4]' $NEWFILE $OLDFILE > $OUTFILE

# This line will effectively delete any lines that are in both 
# $OUTFILE and $OLDFILE, thus finally deleting any records not in
# $NEWFILE.
comm -3 <(sort $OUTFILE) <(sort $OLDFILE) > combined.csv

Еще раз спасибо всем, кто взглянул на это, особенно @Sorpigal !!

1 голос
/ 30 ноября 2011

Если известно, что поля в обоих файлах имеют одинаковый порядок и оба файла сортируются одинаково, используйте comm (и если файлы не известны как отсортированныетогда некоторая предварительная обработка с sort исправит это.)

comm -1 -3 oldfile newfile

Это будет список строк, которые появляются только в новом файле.

comm -1 -2 oldfile newfile

Это будет список строк, которые появляются только в обоих файлах.

Все вместе теперь

cat <(comm -1 -2 oldfile newfile) <(comm -1 -3 oldfile newfile) > combined

combined теперь содержит строки, появляющиеся только в новом файле, плюс строки, появляющиеся в обоих старых файлах, которые также были в новом файле.

Примечание. Этоэто примерно то же самое, что просто сказать comm -1 oldfile newfile, но без каких-либо забавных отступов.

К сожалению, вы не можете напрямую записать обратно в oldfile, потому что он может быть обрезан перед чтением.Просто mv -f combined oldfile когда закончите.

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