Обработка текстовых файлов в Linux - соединять ломаные линии - PullRequest
0 голосов
/ 07 декабря 2018

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

Каждый раз должно быть:

tst1|tst2|tst3|tst4|tst5|tst6|tst7|tst8  

Но иногда я получаю:

tst1|tst2|tst3|tst4|  
tst5|tst6|tst7|tst8  

Я думал, что я должен в первом числе разделителя счета в каждой строке, когда число не будет равно 7, тогда я должен соединить эти 2 строки.Но проблема в том, как это сделать?

Буду благодарен за любые полезные предложения.

1 Ответ

0 голосов
/ 07 декабря 2018

Если ваши записи не разбиты более чем на две строки, приведенное ниже решение Perl будет работать

/tmp> cat anton.csv
rec1|tst2|tst3|tst4|tst5|tst6|tst7|tst8
rec2|tst2|tst3|tst4|
tst5|tst6|tst7|tst8
rec3|tst2|tst3|tst4|tst5|tst6|tst7|tst8
rec4|tst2|tst3|tst4|tst5|tst6|
tst7|tst8
rec5|tst2|tst3|tst4|tst5|tst6|tst7|tst8
rec6|tst2|tst3|tst4|tst5|
tst6|tst7|tst8
/tmp> perl -F"\|" -ane ' if($#F==7) { print;$x=0;} else { chomp; $x++;print } print "\n" if $x==2 ' anton.csv
rec1|tst2|tst3|tst4|tst5|tst6|tst7|tst8
rec2|tst2|tst3|tst4|tst5|tst6|tst7|tst8
rec3|tst2|tst3|tst4|tst5|tst6|tst7|tst8
rec4|tst2|tst3|tst4|tst5|tst6|tst7|tst8
rec5|tst2|tst3|tst4|tst5|tst6|tst7|tst8
rec6|tst2|tst3|tst4|tst5|tst6|tst7|tst8
/tmp>

awk:

/tmp> awk -F"|" '{ if(NF==8)  { print;next } else { prev=curr;curr=sprintf("%s",$0);rc=rc+NF} if(rc==9) { print prev curr;rc=0 } }' anton.csv
rec1|tst2|tst3|tst4|tst5|tst6|tst7|tst8
rec2|tst2|tst3|tst4|tst5|tst6|tst7|tst8
rec3|tst2|tst3|tst4|tst5|tst6|tst7|tst8
rec4|tst2|tst3|tst4|tst5|tst6|tst7|tst8
rec5|tst2|tst3|tst4|tst5|tst6|tst7|tst8
rec6|tst2|tst3|tst4|tst5|tst6|tst7|tst8
/tmp>
...