我有一个tab-delim文件,每行的列数不等,如下所示:
1_20_50_x_y_d 1_39_60_x_y_z 1_25_50_d_f_g 1_30_55_e_f_g
1_10_50_x_y_d 1_29_60_x_y_z 1_30_70_d_f_g
1_20_50_x_y_d 1_39_80_x_y_z
对于每一列,我需要提取由“_”分隔的前三个元素,并且需要在所有列中写入第二个和第三个元素的最小值和最大值。第一列与第一列保持相同。输出如下:
1 20 60
1 10 70
1 20 80
答案 0 :(得分:2)
$ cat tst.awk
BEGIN { FS=OFS="\t" }
{
for (i=1; i<=NF; i++) {
split($i,f,/_/)
if (i == 1) {
key = f[1]
min = max = f[2]
}
min = (f[2] < min ? f[2] : min)
min = (f[3] < min ? f[3] : min)
max = (f[2] > max ? f[2] : max)
max = (f[3] > max ? f[3] : max)
}
print key, min, max
}
$ awk -f tst.awk file
1 20 60
1 10 70
1 20 80
我建议你(以及其他所有操纵文本的人)阅读Arnold Robbins撰写的有效Awk编程,第4版。