私は初めて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 /
/