У меня есть 2 больших файла CSV, file1.csv, который похож на это
1,2,3,4
1,4,5,6
1,7,8,9
1,11,13,17
file2.csv, который похож на это
1,2,3,4
1,7,8,9
2,4,9,10
13,14,17,18
Это просто случайные числа, которые я составил, в основном два числа, где идентичный, и отсортировал. Я хочу сравнить file1.csv и file2.csv и затем скопировать строки, которые присутствуют в file1.csv, но не в file2.csv к file3.csv. разделитель является запятой, очевидно,
Я попробовал
comm -2 -3 file.csv file2.csv > file3.csv
и я попробовал
diff -u file.csv file2.csv >> file3.csv
Оба не работали, потому что file3 был больше, чем file1 и file2. Я попробовал отличающийся diff
и comm
команды, иногда это больше, чем file2 и о том же размере как файл file1, я знаю, что file3 должен быть значительно меньше в размере, чем file1 и file2. И конечно я посмотрел на file3, не результаты, которые я хотел
На данном этапе я знаю, что это могло быть, покончили diff
или comm
но я не знаю, что команда использует.
Попробуйте эту команду:
grep -v -f file2.csv file1.csv > file3.csv
Согласно grep руководство :
-f FILE, --file=FILE
Obtain patterns from FILE, one per line. The empty file
contains zero patterns, and therefore matches nothing. (-f is
specified by POSIX.)
-v, --invert-match
Invert the sense of matching, to select non-matching lines. (-v
is specified by POSIX.)
, Поскольку Steeldriver, сказанный в его комментарии, лучше, добавляют также -x
и -F
что:
-F, --fixed-strings
Interpret PATTERN as a list of fixed strings, separated by
newlines, any of which is to be matched. (-F is specified by
POSIX.)
-x, --line-regexp
Select only those matches that exactly match the whole line.
(-x is specified by POSIX.)
Так, лучшая команда:
grep -xvFf file2.csv file1.csv > file3.csv
Это использование команды file2.csv
строка как шаблон и строка печати file1.csv
, который не соответствует (-v
).
Чтобы быть в состоянии использовать comm
, необходимо отсортировать строки сначала.
comm -23 <(sort file1.csv) <(sort file2.csv) > file3.csv
Опция Python:
#!/usr/bin/env python3
import sys
def readfile(file):
with open(file) as src:
return [line.strip() for line in src.readlines()]
lines_1 = readfile(sys.argv[1]); lines_2 = readfile(sys.argv[2])
for line in lines_1:
if not line in lines_2:
print(line)
Вывод:
1,4,5,6
1,11,13,17
Вставьте сценарий в пустой файл как extract.py
, сделайте это исполняемым файлом и выполните его командой:
<script> <file_1> <file_2>
Или, для записи этого непосредственно в file_3:
<script> <file_1> <file_2> >file_3
Используя diff
команда делают grep
и никакое требуемое хранение.
Вывод, если строки существуют в file1, но не в file2:
$ diff file{1,2}.csv | grep -Po "^< \K.*"
1,4,5,6
1,11,13,17
И вывод, если строки существуют в file2, но не в file1 только с изменением оставленного угла (<
) к прямому углу (>
):
$ diff file{1,2}.csv | grep -Po "^> \K.*"
2,4,9,10
13,14,17,18