$ cat del.awk
BEGIN { FS=OFS="|" }
{
for (i=1; i<=NF; ++i) {
if ($i ~ /[^0-9.]/) {
gsub("\"","", $i)
$i = "\"" $i "\""
}
}
print
}
$ awk -f del.awk file.txt
0.010|"hell&0"|"w#rld'"|201
0.301|"[email protected]%"|"t^h!at"|5.0
EDIT:
Как указывалось в комментариях, более надежное решение может быть вместо этого проверьте, может ли поле быть преобразовано в число и окружено цитатами только если нет:
BEGIN { FS=OFS="|" }
{
for (i=1; i<=NF; ++i) {
if ($i != $i + 0) {
# the field could not be converted into a number
gsub("\"","", $i);
$i = "\"" $i "\""
}
}
print
}
Обратите внимание, что в первом растворе 0x0A
будет заключен в кавычки, а во втором растворе не будет. И наоборот, в первом решении 0.3.1
будет не быть окружен кавычками, но во втором решении это будет.
Возможно, это не имеет значения, в зависимости от ваших данных, но есть вероятность, что второе решение более подходит.
Способ цитирования внутренних котировок в поле CSV состоит в их удвоении: 'hel 'l & 0' ==>' 'hel" "l & 0" '(http://www.ietf.org/rfc/rfc4180.txt) –