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