使用AWK按组选择第一个第n行

时间:2010-12-02 10:55:44

标签: awk

我有以下4个字段的文件。字段2中有3个组,第4个字段包含0和1。

第一个字段只是索引。

我喜欢使用AWK执行以下任务

  1. 选择组1的前3行(请注意,组1只有2行)。行数基于第4个字段中找到的1的数量。

  2. 选择第2组的前6行。行数基于第4个字段中找到的1的数量。

  3. 选择第3组的前9行。行数基于第4个字段中找到的1的数量。

  4. 因此为输出文件选择了17行。

    感谢您的帮助。

    Input 
    
    1   1  TN1148 1
    2   1  S52689 0
    3   2  TA2081 1
    4   2  TA2592 1
    5   2  TA4011 0
    6   2  TA4246 0
    7   2  TA4275 0
    8   2  TB0159 0
    9   2  TB0392 0
    10  3  TB0454 1
    11  3  TB0496 1
    12  3  TB1181 1
    13  3  TC0027 0
    14  3  TC1340 0
    15  3  TC2247 0
    16  3  TC3094 0
    17  3  TD0106 0
    18  3  TD1146 0
    19  3  TD1796 0
    20  3  TD3587 0
    
    Output 
    
     1  1  TN1148 1
     2  1  S52689 0
     3  2  TA2081 1
     4  2  TA2592 1
     5  2  TA4011 0
     6  2  TA4246 0
     7  2  TA4275 0
     8  2  TB0159 0
     10 3  TB0454 1
     11 3  TB0496 1
     12 3  TB1181 1
     13 3  TC0027 0
     14 3  TC1340 0
     15 3  TC2247 0
     16 3  TC3094 0
     17 3  TD0106 0
     18 3  TD1146 0
    

2 个答案:

答案 0 :(得分:2)

这个awk程序的关键是将输入文件传递两次:一次计算你想要的行数和一次打印它们。

awk '
    NR == FNR {wanted_rows[$2] += 3*$4; next} 
    --wanted_rows[$2] >= 0 {print}
' input_file.txt input_file.txt

答案 1 :(得分:0)

#!/usr/bin/awk -f
# by Dennis Williamson - 2010-12-02
# for http://stackoverflow.com/questions/4334167/selecting-first-nth-rows-by-groups-using-awk
$2 == prev {
    count += $4
    groupcount++
    array[idx++] = $0
}
$2 != prev {
    if (NR > 1) {
        for (i=0; i<count*3; i++) {
            if (i == groupcount) break
            print array[i]
        }
    }
    prev = $2
    count = 1
    groupcount = 1
    split("", array) # delete the array
    idx = 0
    array[idx++] = $0
}
END {
    for (i=0; i<count*3; i++) {
        if (i == groupcount) break
        print array[i]
    }
}