ファイルから関連データを選択する(列および行別)

ファイルから関連データを選択する(列および行別)

以下のように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

関連情報