awkを使用してファイルを繰り返す方法

awkを使用してファイルを繰り返す方法

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

関連情報