У меня есть "test1.csv", и он содержит
200,400,600,800
100,300,500,700
50,25,125,310
и test2.csv, и он содержит
100,4,2,1,7
200,400,600,800
21,22,23,24,25
50,25,125,310
50,25,700,5
сейчас
diff test2.csv test1.csv > result.csv
отличается от
diff test1.csv test2.csv > result.csv
Я не знаю, какой правильный порядок, но я хочу что-то еще, обе команды выше будут выводить что-то вроде
2 > 100,4,2,1,7
3 2,3c3,5
4 < 100,300,500,700
5 < 50,25,125,310
6 \ No newline at end of file
7 ---
8 > 21,22,23,24,25
9 > 50,25,125,310
Я хочу вывести только разницу, поэтому results.csv должен выглядеть следующим образом
100,300,500,700
100,4,2,1,7
21,22,23,24,25
50,25,700,5
Я попробовал diff -q
и , diff -s
но они не делали трюк. Порядок не имеет значения, важно то, что я хочу видеть только разницу, ни>, ни <, ни пробел.
grep -FvF
сделал трюк на небольших файлах, а не на больших
Первый файл содержит более 5 миллионов строк, второй файл содержит 1300.
так что result.csv должен дать ~ 4 998 700 строк
Я также попробовал, grep -F -x -v -f
который не работал.
50,25,125,310
является общим для обоих файлов .. Вы должны удалить это из желаемого вывода ..Ответы:
Походит на работу для
comm
:Как объяснено в
man comm
:Таким образом,
-3
означает, что будут напечатаны только строки, которые являются уникальными для одного из файлов. Однако они имеют отступ в соответствии с тем, в каком файле они были найдены. Чтобы удалить вкладку, используйте:В этом случае вам даже не нужно сортировать файлы, и вы можете упростить приведенное выше:
источник
200,[...]
строки, а? :)Использование
grep
сbash
подстановкой процесса:Чтобы сохранить вывод как
results.csv
:<()
этоbash
схема замещения процессаgrep -vFf test2.csv test1.csv
найдет линии, уникальные только дляtest1.csv
grep -vFf test1.csv test2.csv
найдет линии, уникальные только дляtest2.csv
Наконец, мы подводим итоги
cat
Или, как предложил Оли , вы также можете использовать группирование команд:
Или просто запускайте один за другим, так как они оба пишут в STDOUT, в конечном итоге они будут добавлены:
источник
cat
две перенаправленные команды? Почему бы просто не запустить один, а затем другой?grep ... ; grep ...
или{ grep ... ; grep ... ; }
если вы хотите что-то сделать с коллективным выходом.Если порядок строк не имеет значения, используйте
awk
илиperl
:Используйте,
grep
чтобы получить общие линии и отфильтровать их:Внутренний grep получает общие строки, затем внешний grep находит строки, которые не соответствуют этим общим линиям.
источник
sort | uniq -u
, что дает неправильный ответ, если один файл содержит повторяющиеся строки. Для grep я бы сказал «внутренний» / «внешний», а не «внутренний» / «внешний».awk
будете печатать, и тем, что будут печатать ответыcomm -3
иdiff
ответы.comm -3
. Я не вижу причин, почему я должен это объяснять. Если вы хотите редактировать в заметке, не стесняйтесь.Используйте
--*-line-format=...
вариантыdiff
Вы можете
diff
точно сказать , что вам нужно - объяснено ниже:Можно указать вывод diff очень детально, аналогично
printf
числовому формату.Строки из первого файла
test1.csv
называются «старыми» строками, а строки из второгоtest2.csv
- «новыми» строками. Это имеет смысл, когдаdiff
используется, чтобы увидеть, что изменилось в файле.Нам нужны опции, которые устанавливают формат для «старых» строк, «новых» строк и «неизмененных» строк.
Форматы, которые нам нужны, очень просты:
для измененных строк, новых и старых, мы хотим вывести только текст строк.
%L
является символом формата для текста строки.Для неизмененных строк мы хотим ничего не показывать.
Благодаря этому мы можем написать такие параметры, как
--old-line-format='%L'
и собрать их все вместе, используя данные вашего примера:Примечания по производительности
Поскольку файлы имеют разный размер, попробуйте обменять входные файлы, если это не имеет значения, может случиться так, что внутренняя работа
diff
может обрабатывать один путь лучше, чем другой. Лучше либо меньше памяти, либо меньше вычислений.Существует вариант оптимизации для использования
diff
с большими файлами:--speed-large-files
. Он использует предположения о файловой структуре, поэтому неясно, поможет ли это в вашем случае, но стоит попробовать.Параметры формата описаны
man diff
ниже--LTYPE-line-format=LFMT
.источник
Поскольку заказ не нужно сохранять, просто:
sort test1.csv test2.csv
: слияния и сортировкиtest1.csv
иtest2.csv
uniq -u
: печатает только те строки, которые не имеют дубликатовисточник
diff
результате.