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
正確に何をしようとしているのか(入力に応じて)完全には明確ではありませんが、出力の問題はENDステートメントに印刷を入れるため、awkに供給された最後の行だけが印刷されることです。
次のようにする必要があります。
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
最初はかなり複雑に見えるかもしれませんが、基本的にすべて、すべての改行*
、2つの空白('\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