Найти и заменить огромный список строк в выбранных столбцах файла - PullRequest
0 голосов
/ 31 мая 2018

У меня большой CSV-файл (~ 1 ГБ) - data.csv
Переменная с огромным списком строк, разделенных конвейерами.
list="abc|def|ghi.........."

Цель это поиск 2-го и 3-го столбцов data.csv для каждой строки, указанной в переменной list, и замена ее на строку unassigned

Ниже приведено то, что я придумал,
awk -v list="$list" 'BEGIN{FS=OFS=","}{gsub(list,"unassigned",$2)}{gsub(list,"unassigned",$3)}1' data.csv > data_new.csv

Работает нормально, пока список маленький.Как только переменная списка пересекает строки из 10 тыс., Она выдаст ошибку
/usr/bin/awk: Argument list too long

Есть ли какое-либо решение для обработки этого длинного списка здесь?Абсолютно новое решение также приветствуется.Заранее спасибо.

Примечание. Предпочитает избегать циклического перебора списка, поскольку это снижает производительность.

1 Ответ

0 голосов
/ 31 мая 2018

Сделайте это вместо этого, если вы используете bash:

awk '
BEGIN { FS=OFS="," }
NR==FNR { list=$0; next}
{ gsub(list,"unassigned",$2); gsub(list,"unassigned",$3) }
1' <<<"$list" data.csv > data_new.csv

См. Почему я получаю "/ bin / sh: Список аргументов слишком длинный" при передаче аргументов в кавычках? и Применяется ли ограничение "список аргументов слишком длинный" для встроенных команд оболочки? о том, что происходит с вашим исходным кодом и как это решает проблему.

...