如何使用awk / unix命令拆分所有列并在每行中提取?

时间:2016-08-04 17:19:00

标签: awk

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

1 个答案:

答案 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版。