У меня есть большой 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
). Инструмент импорта для базы данных, которую я использую, не позволяет приводить или манипулировать файлом при импорте.
Какой эффективный способ сделать это из командной строки?
Я не знаю об эффективном, но sed с регулярным выражением. Сделайте резервное копирование файла в случае, если Вы делаете опечатку, но возможно что-то вроде этого:
sed -i 's/"\([0-9]\+\)_\([0-9]\+\)"/\1\2/' bigcsvfile.csv
Редактирование: удаленный g, как Кос, на который указывают, не необходим никакой g.
Так как Ваш файл является большим, я предложил бы использовать 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
: печатает запись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