awk質問 - 一意の日付に対してのみ追加の行を印刷する方法

awk質問 - 一意の日付に対してのみ追加の行を印刷する方法

私は初めてAWKに触れ、他のプログラムへの入力を準備するためにAWKを使用しようとしています。下表のようなデータがありますが、5列から10列までのデータを抽出する必要があります。また、(1列と2〜4列に記載されているように)新しい日付が出るたびに前のコマンド()を作成する必要があります。DATES以下の「必要な出力」を参照してください。

  • 入力例(input.txt) -説明の最初の行は説明のためのものであり、実際のデータには表示されません。

    #  1        2  3   4    5   6   7   8   9   10
    20071016    16 Oct 2007 A   X1  X2  X3  X4  X5
    20071017    17 Oct 2007 A   X1  X2  X3  X4  X5
    20071017    17 Oct 2007 B   X1  X2  X3  X4  X5
    20071018    18 Oct 2007 C   X1  X2  X3  X4  X5
    
  • 予想出力( out.txt)

    DATES
    16 Oct  2007 /
    /
    WCONPROD
    A    X1 X2 X3  X3  X4  X5  /
    /
    DATES
    17 Oct  2007 /
    /
    WCONPROD
    A    X1 X2 X3  X3  X4  X5  /
    /
    WCONPROD
    B    X1 X2 X3  X3  X4  X5  /
    /
    DATES
    18 Oct 2007 /
    /
    WCONPROD
    C    X1 X2 X3  X3  X4  X5  /
    /
    

DATES私が経験している問題は、同じ日付の行が複数ある場合、各日付が一度だけ印刷されることです。これを達成するために、次のAWK行を見つけて修正しましたが、各(新しい)日付に対して一度だけ日付を提供するのに問題があります。別の列を作成し、AWKで最初の列を以前の列と検索または比較しようとしていますが、これを達成する方法がわかりません。

  • awkコマンドが試行されました
    { printf "%-s\n%-s %s  %s %s\n%s\n", "DATES", $2,$3,$4,"/","/" 
      print "\nWCONPROD\n"
      printf "   %-s \t%s %s %s  %s  %s  %s  %s\n%s\n\n", $5, $6, $7, $8, $8, $9, $10, "/","/" }
    
  • これらのAWKコマンドを実行すると、DATES次のように各行が印刷されます。
    DATES
    16 Oct  2007 /
    /
    WCONPROD
    A    X1 X2 X3  X3  X4  X5  /
    /
    DATES
    17 Oct  2007 /
    /
    WCONPROD
    A    X1 X2 X3  X3  X4  X5  /
    /
    ## i want to remove (not to print) these/next 3 lines as this date was already declared earlier
    DATES
    17 Oct  2007 /
    /
    WCONPROD
    B    X1 X2 X3  X3  X4  X5  /
    /
    DATES
    18 Oct 2007 /
    /
    WCONPROD
    C    X1 X2 X3  X3  X4  X5  /
    /
    

ベストアンサー1

次のawkプログラムはこの問題を解決する必要があります。

awk '$1!=lastdate {printf "DATES\n%s %s %s /\n/\n",$2,$3,$4; lastdate=$1}
     {print "WCONPROD"; for (i=5;i<=NF;i++) printf "%s%s",$i,OFS; print "/\n/"}' input.txt

最初の列の値を変数の内容と比較しlastdate、異なる場合は指定された「ヘッダー」部分を印刷します。また、lastdateオンラインで見つかった新しい日付に更新されます。

WCONPRODすべての行に対して文字列を印刷し、フィールドフィールドの区切り記号で区切られたフィールド5から(フィールド数に関係なく)を印刷します(デフォルトは単一のスペースであり、コマンドライン-v OFS='whatever'引数によって変更される可能性があります)。 need)と入力して/ <newline> /パターンを渡します。

あなたの例の出力:

DATES
16 Oct 2007 /
/
WCONPROD
A X1 X2 X3 X4 X5 /
/
DATES
17 Oct 2007 /
/
WCONPROD
A X1 X2 X3 X4 X5 /
/
WCONPROD
B X1 X2 X3 X4 X5 /
/
DATES
18 Oct 2007 /
/
WCONPROD
C X1 X2 X3 X4 X5 /
/

おすすめ記事