2015-08-17 3 views
-1

Я хотел бы поставить кавычки вокруг полей в файле с разделителями, в которых есть нечисловые символы в файле, а также удалить любые внутренние двойные кавычки в поле.поля прокрутки awk, содержащие нечисловые символы

Например:

0.010|hel"l&0|w#rld'|201 
0.301|[email protected]%"|t^h!at|5.0 

Если в результате:

0.010|"hell&0"|"w#rld'"|201 
0.301|"[email protected]%"|"t^h!at"|5.0 
+1

Способ цитирования внутренних котировок в поле CSV состоит в их удвоении: 'hel 'l & 0' ==>' 'hel" "l & 0" '(http://www.ietf.org/rfc/rfc4180.txt) –

ответ

2
$ 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 будет не быть окружен кавычками, но во втором решении это будет.

Возможно, это не имеет значения, в зависимости от ваших данных, но есть вероятность, что второе решение более подходит.

+0

Вы также можете написать 'if ($ i! = $ I + 0)', чтобы различать числа и числа. –

+0

Спасибо, @glennjackman, мне очень нравится эта идея. Я обновил ответ, предлагая его как вероятно, более надежной альтернативой. – jas

Смежные вопросы