2014-08-25 2 views
0

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

id;code;description 
1;a;"blablala" 
2;b;"blablabla" 
3;c;"a very long description with 
line breaks 
4;d;"blablabla" 

Я пытался, так и не удалось:

awk -F";|[\".*\";]" '{print NF, "  ", $1,$2,$3,$4}' awk-test.txt 

5  1 a blablala 
5  2 b blablabla 
4  3 c a very long description with 
1  line breaks 
5  4 d blablabla 
+1

Каков ваш ожидаемый выход? –

+0

try 'awk -F"; | [\ ". * \";] "NF {print NF," ", $ 1, $ 2, $ 3, $ 4} 'file' –

+0

Я думаю, что разделитель полей должен быть' -F "[; \"] "' –

ответ

-1

Вы могли бы использовать что-то вдоль этих линий:

BEGIN { FS = "[;\"]+" } 
NR>1 && NF>1 { for(i=1; i<=cols; ++i) printf "%s%s" a[i], (i<cols?OFS:ORS) } 
NF>1 { cols = split($0, a); next } 
{ a[cols] = a[cols] $0 } 
END { for(i=1; i<=cols; ++i) printf "%s%s" a[i], (i<cols?OFS:ORS) } 

Общая идея о том, что продолжение линии добавляются в финал элемент массива a. Когда начинается новая запись, печатается предыдущий массив. Блок END печатает содержимое последней строки.

$ awk -f line.awk file 
id code description 
1 a blablala 
2 b blablabla 
3 c a very long description with line breaks 
4 d blablabla 
Смежные вопросы