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

awk删除cr/lf或字段,直到字段总数,awk,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 } el

我有一份档案

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等作为字段分隔符


谢谢,

您可以尝试以下方法:

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
}
{
子(/[:空白:]*$/,“”)
ss=(NR==1)?$0:(ss“|”$0)
}
结束{
gsub(/\ \ \ \ \ \/,“\”,ss)
n=拆分(ss,a,“|”)
对于(i=1;ignu awk版本(由于RS)


但是你不想把你的输出看作是
1 | 2 | 3 | 4a | b | c | d1 | 2 | 3 | 4a | b | c | d
吗?那么请将你的问题更新为:a)描述导致第三行输出只有3个字段的算法:
1 | 23 | 4
;b)描述一下告诉我们输入行1末尾的“4”和“a”的算法与“2”和“3”合并为“23”的方式不同,输入行2的开头不应合并为单个输出字段“4a”;c)说明是否可以有一个包含5个或更多字段的输入行。
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