根据第一列记录向数据添加新列

时间:2016-03-03 03:30:28

标签: linux

我有以下数据:

Cow_ID  Age DIM MY  MCF MCP MCL Cow_Order
26  1424    0   NA  NA  0.0336  0.0505  
26  1425    1   NA  0.0404  0.0338  0.0505  
26  1426    2   NA  0.0388  0.0337  0.0505  
26  1427    3   NA  0.0391  0.0337  0.0505  
26  1428    4   35.2    0.0393  0.0337  0.0505  
35  1432    8   34.7    0.0396  0.0337  0.0505  
35  1433    9   33.6    0.0397  0.0337  0.0505  
35  1434    10  32.8    0.0397  0.0337  0.0505  
35  1435    11  33.7    0.0388  0.0337  0.0505  
47  1439    15  30.8    0.0391  0.0337  0.0505  
47  1440    16  31.3    0.0387  0.0337  0.0505  
47  1441    17  33.7    0.0392  0.0337  0.0505  
47  1442    18  30.2    0.0392  0.0337  0.0505  
47  1443    19  34.1    0.0393  0.0337  0.0505  
47  1444    20  33.3    0.0339  0.0286  0.0495  

我想要做的是根据第一列cow_id将1到1000之间的订单(在我的完整数据中)添加到名为Cow_Order的列中: 最终数据应如下所示:

    Cow_ID  Age DIM MY  MCF MCP MCL Cow_Order
26  1424    0   NA  NA  0.0336  0.0505  1
26  1425    1   NA  0.0404  0.0338  0.0505  1
26  1426    2   NA  0.0388  0.0337  0.0505  1
26  1427    3   NA  0.0391  0.0337  0.0505  1
26  1428    4   35.2    0.0393  0.0337  0.0505  1
35  1432    8   34.7    0.0396  0.0337  0.0505  2
35  1433    9   33.6    0.0397  0.0337  0.0505  2
35  1434    10  32.8    0.0397  0.0337  0.0505  2
35  1435    11  33.7    0.0388  0.0337  0.0505  2
47  1439    15  30.8    0.0391  0.0337  0.0505  2
47  1440    16  31.3    0.0387  0.0337  0.0505  3
47  1441    17  33.7    0.0392  0.0337  0.0505  3
47  1442    18  30.2    0.0392  0.0337  0.0505  3
47  1443    19  34.1    0.0393  0.0337  0.0505  3
47  1444    20  33.3    0.0339  0.0286  0.0495  3

由于

2 个答案:

答案 0 :(得分:1)

如果名为testfile的文件中的数据,请尝试:

count=1;for cow_id in `awk  '{if(FNR>1) print $1}' testfile |sort |uniq`; do awk -v cid=$cow_id -v orderid=$count '{if($1 == cid) {print $0"\t"orderid}} ' testfile; ((count++));done

输出:

26  1424    0   NA  NA  0.0336  0.0505          1
26  1425    1   NA  0.0404  0.0338  0.0505      1
26  1426    2   NA  0.0388  0.0337  0.0505      1
26  1427    3   NA  0.0391  0.0337  0.0505      1
26  1428    4   35.2    0.0393  0.0337  0.0505          1
35  1432    8   34.7    0.0396  0.0337  0.0505          2
35  1433    9   33.6    0.0397  0.0337  0.0505          2
35  1434    10  32.8    0.0397  0.0337  0.0505          2
35  1435    11  33.7    0.0388  0.0337  0.0505          2
47  1439    15  30.8    0.0391  0.0337  0.0505          3
47  1440    16  31.3    0.0387  0.0337  0.0505          3
47  1441    17  33.7    0.0392  0.0337  0.0505          3
47  1442    18  30.2    0.0392  0.0337  0.0505          3
47  1443    19  34.1    0.0393  0.0337  0.0505          3
47  1444    20  33.3    0.0339  0.0286  0.0495          3

答案 1 :(得分:1)

做什么人'在任何Linux系统上你都应该得到一个新的手册页。虽然GNU的改进版本被称为gawk初学者可能看不出两者之间的差异,尽管高级人员肯定会这样做。

generate | awk '
        /Cow_ID/ {print "\t" $0, "Cow_Order"; next;}
          { if ( $1 != Cow_last ) { 
               Cow_Order++;
               Cow_last = $1;
            }
            print $0, Cow_Order 
          }'

如果要格式化为整齐的列或许多其他方式,请查看awk的printf()函数。