Linux 文本文件处理 - 加入虚线
Linux text file processing - join broken lines
我在处理文件时遇到问题。我排除了包含 8 列的文件,这些列由 delimter 管道分隔。问题是有时我会收到带有断线的文件,如下例所示。
每次应该是:
tst1|tst2|tst3|tst4|tst5|tst6|tst7|tst8
但有时我有:
tst1|tst2|tst3|tst4|
tst5|tst6|tst7|tst8
我认为我应该在每行中首先计算定界符的数字,当数字不等于 7 时,我应该加入那两行。但问题是如何去做呢?
如果有任何有用的建议,我将不胜感激。
假设您的记录不超过 2 行,下面的 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",[=11=]);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>
我在处理文件时遇到问题。我排除了包含 8 列的文件,这些列由 delimter 管道分隔。问题是有时我会收到带有断线的文件,如下例所示。
每次应该是:
tst1|tst2|tst3|tst4|tst5|tst6|tst7|tst8
但有时我有:
tst1|tst2|tst3|tst4|
tst5|tst6|tst7|tst8
我认为我应该在每行中首先计算定界符的数字,当数字不等于 7 时,我应该加入那两行。但问题是如何去做呢?
如果有任何有用的建议,我将不胜感激。
假设您的记录不超过 2 行,下面的 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",[=11=]);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>