удалить все строки в файле, содержащие строку из другого файла - PullRequest
0 голосов
/ 21 ноября 2018

Я хочу удалить все строки файла, основываясь на совпадении строки из другого файла.Это то, что я использовал, но он только удаляет некоторые:

grep -vFf to_delete.csv inputfile.csv > output.csv

Вот примеры строк из моего входного файла (inputfile.csv):

Ata,Aqu,Ama3,Abe,0.053475,0.025,0.1,0.11275,0.1,0.15,0.83377
Ata135,Aru2,Aba301,A29,0.055525,0.025,0.1,0.082825,0.075,0.125
Ata135,Atb,Aca,Am54,0.14695,0.1,0.2,0.05255,0.025,0.075,0.8005,
Adc,Aru7,Ama301,Agr84,0.002075,0,0.025,0.240075,0.2,0.

Мой файл "to_delete.csv"выглядит так, например:

Aqu
Aca

Таким образом, любая строка с этими строками должна быть удалена, в этом случае строки 1 и 3 должны быть удалены.Пример желаемого выхода:

Ata135,Aru2,Aba301,A29,0.055525,0.025,0.1,0.082825,0.075,0.125
Adc,Aru7,Ama301,Agr84,0.002075,0,0.025,0.240075,0.2,0.

1 Ответ

0 голосов
/ 21 ноября 2018

РЕДАКТИРОВАТЬ: Поскольку OP имел символы каретки в своих файлах, поэтому добавим решение для этого тоже сейчас.

cat -v Input_file     ##To check if carriage returns are there or not.
tr -d '\r' < Input_file > temp_file  &&  mv temp_file Input_file

Поскольку ваши образцы Input_file и ожидаемый результатне ясно, поэтому не смог полностью протестировать его, пожалуйста, попробуйте следующее. (если вы в порядке с awk), добавьте > temp_file && mv temp_file Input_file в коде для сохранения вывода в сам файл Input_file.

awk -F, 'FNR==NR{a[$0];next} {for(i=1;i<=NF;i++){if($i in a){next}}} 1'  to_delete.csv  Input_file  > temp_file  && mv temp_file  Input_file

Объяснение: Добавление пояснения к вышеуказанному коду тоже сейчас.

awk -F, '                          ##Setting field separator as comma here.
FNR==NR{                           ##checking condition FNR==NR which will be TRUE when first Input_file is being read.
  a[$0]                            ##Creating an array named a whose index is $0.
  next                             ##next will skip all further statements from here.
}
{
  for(i=1;i<=NF;i++){              ##Starting a for loop from value i=1 to till value of NF.
     if($i in a){                  ##checking if $i is present in array a if yes then go into this condition block.
       next                        ##next will skip all further statements(since we DO NOt want to print any matching contents)
     }                             ##Closing if block now.
  }                                ##Closing for block here.
}                                  ##Closing block which should be executed for 2nd Input_file here.
1                                  ##awk works on pattern and action method so making condition TRUE here and not mentioning any action so by default print of current line will happen.
'  to_delete.csv  Input_file       ##Mentioning Input_file names here now.
...