BASH Субстратирование файлов по ключу построчно - PullRequest
1 голос
/ 30 июня 2011

Я просто хочу вычесть один CSV-файл из другого, но не если линии совпадают.Вместо сравнения строк я бы хотел посмотреть, совпадают ли строки в одном поле.

например, первый файл

EMAIL;NAME;SALUTATION;ID
foo@bar.com;Foo;Mr;1
bar@foo.com;Bar;Ms;2

и второй файл

EMAIL;NAME
foo@bar.com;Foo

файл результата должен быть

EMAIL;NAME;SALUTATION;ID
bar@foo.com;Bar;Ms;2

Я думаю, вы понимаете, о чем я;)

Как это возможно в bash?Мне легко делать это на Java, но я действительно хотел бы научиться делать это в bash.Также я могу вычесть, сравнив строки с помощью сортировки

#! / bin / bash    
echo "Substracting Files..."

sort "/tmp/list1.csv" "/tmp/list2.csv" "/tmp/list2.csv" | uniq -u >> /tmp/subList.csv

echo "Files successfully substracted."

Но строки не являются одним и тем же кортежем.Поэтому мне нужно сравнить строку с ключами.

Есть предложения?Большое спасибо .. Нильс

Ответы [ 2 ]

4 голосов
/ 30 июня 2011

Мне может прийти в голову одно из возможных решений (работа с bash):

grep -v -f <(cut -d ";" -f1 /tmp/list2.csv) /tmp/list1.csv

Это значит:
cut -d ";" -f1 /tmp/list2.csv: извлечь первый столбец второго файла.
grep -f some_file: использовать файл в качестве источника шаблона.
<(some_command): Это замена процесса. Он выполняет команду и передает вывод в именованный канал, который затем может быть использован в качестве входного файла grep -f.
grep -v: печатать только строки, не соответствующие шаблону (ам).

1 голос
/ 30 июня 2011

Обновление: решение вопроса, через join и awk.

join --header -1 1 -2 1 -t";" --nocheck-order -v 1 1.csv 2.csv | | awk 'NR==1 {print gensub(";[^;]\\+$","","g");next} 1'     

Это были обратные ответы:

$ join -1 1 -2 1 -t";" --nocheck-order -o 1.1,1.2,1.3,1.4 1.csv 2.csv 
EMAIL;NAME;SALUTATION;ID
foo@bar.com;Foo;Mr;1

join на помощь.

Или пропустить печать поля ИМЯ без -o:

$ join -1 1 -2 1 -t";" --nocheck-order 1.csv 2.csv | awk 'BEGIN {FS=";" ; OFS=";"} {$NF=""; print }'

(Но он по-прежнему печатает плюс ; - после последнего поля.

НТН

...