awk删除cr / lf或字段直到总字段

时间:2013-12-04 17:42:47

标签: awk

我有一个文件

1|2|3|4
a|b|c|d
1|2
3|4
a|
b|
c|
d|

该文件应该有4个字段可以加载到数据库中。该文件可能包含cr,lf或行尾字符。

我希望看到的输出是

1|2|3|4
a|b|c|d
1|23|4
a|b|c|d

我试过了

BEGIN {FS="|";break_flag = 0;field_count=4}
{
#print NF      
delc=gsub(/\|/,"|",$0)
print delc 
if (NF == 4 )
{
print $0
}
else if (delc != 3)
{
#gsub("\"","")
gsub(/\r/,"")
printf("%s|",$0)
}
}

我想要的是,如果该行没有4个字段,请继续阅读,直到获得4个字段并打印出没有cr,lf等的字段。作为字段分隔符

谢谢,

2 个答案:

答案 0 :(得分:0)

您可以尝试以下内容:

awk -f f.awk input.txt

其中f.awk

{
    sub(/[[:blank:]]*$/,"")
    ss=(NR==1)?$0: (ss "|" $0)
}
END {
    gsub(/\|\|/,"|",ss)
    n=split(ss,a,"|")
    for (i=1; i<=n; i+=4)
        for (j=0; j<4; j++)
           printf "%s%s",a[i+j],(j<3)?"|":ORS
}

答案 1 :(得分:0)

gnu awk版本(由于RS)

awk '$1=$1 {printf "%s" (NR%4?"|":"\n"),$0}' RS="[|\n]" file
1|2|3|4
a|b|c|d
1|2|3|4
a|b|c|d