从文件中选择相关数据(每列和行)

从文件中选择相关数据(每列和行)

我有 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

假设每行有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 的一种方法是

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

使用 GNU awk 处理多字符 RS 和 RT,并假设每个记录始终有 3 行,如示例输入所示:

$ 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

相关内容