Сравнение двух столбцов CSV-файла и отображение только несовпадающих записей

Вместо использования поиска и восьмеричного режима. Это можно сделать одной командой (При использовании современногоchmod).

chmod -R u=rw,og=r,+X «directory to be fixed»

0
25.04.2021, 12:45
3 ответа

Две очень короткие команды, просто для простоты:

awk -F, '$3 != $4' file.csv >file1
awk -F, '$3 == $4' file.csv >file2

Обе эти команды обрабатывают строки в file.csvкак набор полей, разделенных запятыми -. Всякий раз, когда третье поле не равно четвертому полю, первая команда записывает текущую строку (, и она записывается в file1через перенаправление вывода ). Вторая команда делает то же самое, но с противоположной логикой (, и вывод идет на file2).

Использование одной команды немного сложнее, но позволяет вам давать имена выходным файлам в командной строке с помощью простых перенаправлений из файловых дескрипторов 3 и 4:

$ awk -F, '{ fd = $3 == $4 ? 4 : 3;  print >("/dev/fd/" fd) }' file.csv 3>file1 4>file2
$ cat file1
1311,0008,a131,a132,7039
1711,2046,a626565,a626566,7099
$ cat file2
1311,0008,a131,a131,7039
1711,2048,a626565,a626565,7035

Или то же самое, но более запутанное,

awk -F, '{ print >("/dev/fd/" 3 + ($3 == $4)) }' file.csv 3>file1 4>file2
1
28.04.2021, 22:51
awk -F, '{ print >($3==$4?"matchedFile":"notMatchedFile") }' infile

это выборочное перенаправление строк в один из двух выходных файлов, если столбец #3 был одинаково полное совпадение строки со столбцом #4 (столбцы разделяются запятой, это указано by -F,), запись в выходной файл matchedFile, иначе запись в notMatchedFile.

см. другие варианты соответствия здесь .


$ head matchedFile notMatchedFile
==> matchedFile <==
1311,0008,a131,a131,7039
1711,2048,a626565,a626565,7035

==> notMatchedFile <==
1311,0008,a131,a132,7039
1711,2046,a626565,a626566,7099

или аналогично, но сделать команду более компактной:

awk -F, '{ print >"file"($3==$4) }' infile

$ head file[01]
==> file0 <==
1311,0008,a131,a132,7039
1711,2046,a626565,a626566,7099

==> file1 <==
1311,0008,a131,a131,7039
1711,2048,a626565,a626565,7035
2
28.04.2021, 22:51

Метод GNU sed:

F="[^,]*,"
sed -En "
  /^($F){2}($F)\\2/w match.csv"'
  //!w nomatch.csv
' file.csv

Результаты сохраняются в файлах match/nomatch.CSV в текущем каталоге.

0
28.04.2021, 22:51

Теги

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