У меня есть файл, содержащий два миллиона строк формы:
"00005cea-668e-4475-9e19-92a25c8b74fb",129.24728",D#
последнее значение должно на самом деле быть:
"00005cea-668e-4475-9e19-92a25c8b74fb",129.24728,"D#"
Как я использую команду sed для фиксации этого файла, таким образом, побочное "удалено, и последнее значение дважды заключается в кавычки
Вы могли попробовать что-то как:
sed -r 's/",([^,]*)$/,"\1"/' input-file
Это ",
сопровождается чем-либо, что это не запятая ([^,]
), пока конец файла $
. \1
не является частью, подобранной в круглых скобках - ([^,]*)
.
Похоже, что Ваши поля определяются запятыми. Если так, можно сделать это в sed
:
sed -i -r 's/",([^,]*)$/,"\1"/' file
Или, в Perl:
perl -i -lpe 's/",([^,]*)$/,"\1"/' file
В обоих случаях, regex просто ищет запятую, тогда 0 или больше незапятых до конца строки. Круглые скобки получают последние поля, которые мы можем тогда назвать \1
(или $1
в жемчуге). Это тогда заменяется отдельно в двойных кавычках. Эти -i
для редактирования файла на месте, изменения внесены в исходный файл.
Вы могли также использовать awk
:
awk -F, -vOFS=, '{sub(/"/,"",$(NF-1)); $NF="\""$NF"\""}1;' file
Или, если Ваша поддержка версии это:
awk -iinplace -F, -vOFS=, '{sub(/"/,"",$(NF-1)); $NF="\""$NF"\""}1;' file
Нет sed
, но perl
:
perl -F, -ane '($f1)=$F[1]=~/(.*)"/; $F[2]=~s/\n//g; print "$F[0],$f1,\"$F[2]\"\n";'
Объяснение:
perl -F, -ane
читает мудрый строкой вход и разделяет строку на a ,
($f1)=$F[1]=~/(.*)"/;
удаляет "
во втором столбце$F[2]=~s/\n//g;
удаляет новую строку в концеprint "$F[0],$f1,\"$F[2]\"\n";
пишет вывод и добавляет "
к последнему значениюРедактирование - сокращенная Версия (благодаря @kos):
perl -F, -lane '$F[1]=~s/"$//; print "$F[0],$F[1],\"$F[2]\"";'