我在 ksh 脚本中使用此命令sed -e '/^*/d' $WORKFILE | awk -f test.awk >> $OUTPUTFILE
来获取 274567 行的文件,如下所示
*
*
*
*
*
syopsf00
a0000096
782 1
CAStmtInv
syopsf00
a0000096
782 1
USStmtInv
syopsf00
a0000096
606 1
CAStmtInv
syopsf00
a0000096
606 1
USStmtInv
syopsf00
a0000096
23472 4
AO
syopsf00
a0000096
23472 4
Dealer
*
*
*
*
*
*
*
*
*
*
*
*
*
*
*
*
*
*
并生成一个包含如下行的文件
syopsf00 a0000096 782 1 CAStmtInv
syopsf00 a0000096 782 1 USStmtInv
syopsf00 a0000096 606 1 CAStmtInv
syopsf00 a0000096 606 1 USStmtInv
但我得到的只是
syopsf00 a0000096 782 1 CAStmtInv
awk 脚本(test.awk)如下所示
BEGIN {
RS="\n\n";
FS=" ";
}
END {
print $1,$2,$3,$4,$5;
}
答案1
虽然(给定您的输入)不太清楚您要完全执行什么操作,但输出的问题是只有送入 awk 的最后一行才会被打印,因为您将打印放在 END 语句中。
它应该看起来像这样:
BEGIN {
RS="\n\n"; FS=" ";
}
{
print $1,$2,$3,$4,$5;
}
注意:缩进只是我个人的喜好。
答案2
我希望鞋底awk
就足够了
awk '
/syopsf00/{print ""}
!/^[*]/{printf "%s",$0}
END{print ""}
' $WORKFILE >> $OUTPUTFILE
或者,如果您想去除多个空格并使用 awk-scriptfile:
awk -f test.awk "$WORKFILE" >> "$OUTPUTFILE"
哪里test.awk
:
#!/usr/bin/awk -f
/syopsf00/{print ""}
!/^[*]/{printf ("%s",$1" "$2" "}
END{print ""}
答案3
纯sed
单行:
sed ':X;N;s/*//;$!bX;s/\n /\t/g;:Y;s/\n\n//g;tY' $WORKFILE
一开始它可能看起来相当复杂,但基本上它会删除所有*
,然后删除所有换行符,后跟两个空格('\n '
),最后删除双换行符\n\n
以进行清理。这个表达式很可能可以简化。
我使用制表符\t
而不是空格作为字段分隔符以更好地对齐列,输出是
syopsf00 a0000096 782 1 CAStmtInv
syopsf00 a0000096 782 1 USStmtInv
syopsf00 a0000096 606 1 CAStmtInv
syopsf00 a0000096 606 1 USStmtInv
syopsf00 a0000096 23472 4 AO
syopsf00 a0000096 23472 4 Dealer