以下のようにfile1があります。
0 0
0 1
0 8
ST1 2 3
5 2
2 2
ST3 4 3
4 2
5 5
ST5 1 9
1 5
7 8
必須出力ファイル:
ST1 6 5 2
ST3 12 4 5
ST5 9 1 7
この問題を解決するには? awkを使いたいです。目的の出力のように見えるように、これらの行を処理できるアルゴリズムを作成する方法がわかりません。
パターン(ST)を探してその地点から処理を始めたいという考えだ。
出力ファイルスキーム:ST *、2列に「ST」がある行の3列を掛け、「ST」の下の行の1列を掛けます。ただし、次に「ST」が表示されるまでのみ該当します。
また、最初のST *より前には何も処理したくありません。
答え1
何でもawk
:
$ awk '/^ST/{c=1} c{ printf "%s", (c++==1? ors $1 OFS $2*$3: OFS $1); ors=ORS }
END{ print "" }' infile
ST1 6 5 2
ST3 12 4 5
ST5 9 1 7
答え2
1行に2つの数字があると仮定すると、RS
レコード区切り記号()を「インシ":
awk '
BEGIN{RS="ST"}
NR>1 {print RS $1, $2*$3, $4, $6}
' file
出力:
ST1 6 5 2
ST3 12 4 5
ST5 9 1 7
注:GNUが必要ですawk
。
答え3
このpbmを実装する1つの方法は次のとおりです。
awk -v ORS= '
($1 ~ /^ST[0-9]/) && (NF > 2) {
if (f++) print RS
print $1, $2*$3
next
}
f {print "", $1}
END {print RS}
' file
出力:
ST1 6 5 2
ST3 12 4 5
ST5 9 1 7
答え4
例の入力に示すように、レコードごとに常に3行があるとし、GNU awkを使用して複数文字のRSとRTを処理します。
$ awk -v RS='ST([^\n]+\n){3}' '{$0=RT; print $1, $2*$3, $4, $6}' file
ST1 6 5 2
ST3 12 4 5
ST5 9 1 7