Сравнение двух текстовых файлов

У меня есть 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 но я не знаю, что команда использует.

6
задан 7 November 2014 в 18:29

4 ответа

Попробуйте эту команду:

 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).

7
ответ дан 17 November 2019 в 04:38

Чтобы быть в состоянии использовать comm, необходимо отсортировать строки сначала.

comm -23 <(sort file1.csv) <(sort file2.csv) > file3.csv
7
ответ дан 17 November 2019 в 04:38

Опция 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
3
ответ дан 17 November 2019 в 04:38

Используя 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
3
ответ дан 17 November 2019 в 04:38

Другие вопросы по тегам:

Похожие вопросы: