是否可以在一个命令中更改列标题并过滤列?

时间:2017-07-17 14:04:58

标签: bash awk

在使用统计软件阅读之前,我正在使用awk过滤大文本文件中的有趣行。 这是一些虚拟数据

printf 'VEGETABLE_NAME,RECIPE_NAME,OBSCURE_CODE\ncarrot,cake,1\ncarrot,soup,1\npotato,cake,2\nspinach,soup,1' > dummydata.dat

我设法:

  1. 更改列标题

    $ awk -F, 'NR==1 {$0="vegetable,recipe,code"} 1' dummydata.dat
    vegetable,recipe,code
    carrot,cake,1
    carrot,soup,1
    potato,cake,2
    spinach,soup,1
    
  2. 过滤产品代码1

    $ awk -F, '$3 ~ /^1/' dummydata.dat
    carrot,cake,1
    carrot,soup,1
    spinach,soup,1
    
  3. 但是当我尝试组合两个命令时,结果不包括列标题:

    $ awk -F, 'NR==1 {$0="vegetable,recipe,code"} $3 ~ /^1/' dummydata.dat
    carrot,cake,1
    carrot,soup,1
    spinach,soup,1
    

2 个答案:

答案 0 :(得分:2)

在您的方法中,您没有获得列标题,因为它将打印行 仅根据条件

$3 ~ /^1/ 

如果评估为真(1),则打印其他(0)。不幸的是,它会为标题评估false。

以下是我的尝试

awk -v FS="," 'BEGIN{print "vegetable,recipe,code"}NR>1 && $3==1'
vegetable,recipe,code
carrot,cake,1
carrot,soup,1
spinach,soup,1

答案 1 :(得分:2)

您为$0设置NR==1,但该记录永远不会在任何地方打印。

您可以对脚本进行一些小改动:

awk -F, 'NR==1{print "vegetable,recipe,code"} $3 ~ /^1$/' dummydata.dat

vegetable,recipe,code
carrot,cake,1
carrot,soup,1
spinach,soup,1