Удаление "_" из очень большого файла CSV

У меня есть большой CSV-файл (120 ГБ), который выглядит следующим образом:

"JE",865438083645,2012-12-05T23:07:36.000Z,24,"NQ",142,"658_55525",475035504705
"JE",875619112765,2012-12-05T23:58:04.000Z,4,"PG",144,"219_9221",835399289335
"JE",125495251245,2012-12-05T18:16:06.000Z,206,"PLJE",153,"763_60771",445355650435

Я хотел бы удалить знак подчеркивания и кавычки из значений в седьмом столбце (например, "658_55525" становится 65855525). Инструмент импорта для базы данных, которую я использую, не позволяет преобразовывать файл или управлять им при импорте.

Какой эффективный способ сделать это из командной строки?

3 ответа

Решение

Я не знаю, насколько эффективно, но сед с регулярным выражением. Сделайте резервную копию файла на случай опечатки, но, возможно, что-то вроде этого:

sed -i  's/"\([0-9]\+\)_\([0-9]\+\)"/\1\2/' bigcsvfile.csv

Редактировать: убрал g, как указал Кос, g не требуется.

Perl просто самый быстрый при редактировании больших файлов.

perl -pi.bak -e 's/"([0-9]+)_([0-9]+)"/$1$2/' your_file.csv

Ваш файл резервной копии находится в

your_file.csv.bak

Без резервной копии:

perl -pi -e 's/"([0-9]+)_([0-9]+)"/$1$2/' your_file.csv

Поскольку ваш файл большой, я бы предложил использовать gawk > 4.10.0 вместо awk, который поддерживает редактирование на месте.

С помощью gawk > 4.10.0:

gawk -i inplace 'BEGIN {FS=","; OFS=","}; {gsub(/["_]/,"",$7); print}' inputfile
  • -i inplace: рассказывает gawk редактировать файл на месте

awk разбивка скрипта:

  • BEGIN {FS=","; OFS=","}: устанавливает разделитель полей и выходной разделитель полей на ,
  • gsub(/["_]/,"",$7): заменяет " а также _ символы, содержащиеся в 7-м поле записи с пустой строкой
  • print: печатает запись
Другие вопросы по тегам