【问题标题】:Is it possible to change column header and filter a column in one command?是否可以在一个命令中更改列标题并过滤列?
【发布时间】:2017-07-17 14:04:57
【问题描述】:

我正在使用 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
    

但是当我尝试组合这两个命令时,结果不包括列标题:

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

【问题讨论】:

  • 第一个代码中的1 打印$0...您尝试的组合,$0 已分配但未打印...当满足$3 ~ /^1/ 条件时,$0 是打印...一个简单的更改应该可以工作...awk -F, 'NR==1 {print "vegetable,recipe,code"} $3 ~ /^1/'
  • 也用于字符串比较,只需使用$3 == "1" 不需要正则表达式.. $3 ~ /^1/ 将匹配1110asad 等等..
  • 对不起,我不打算劫持您的问题,想知道这是否可以通过 grep 您想要的内容并在保存到另一个文件时添加标题来实现?
  • @Sundeep 我实际上需要一个正则表达式来处理原始的、更复杂的数据集,但当然有了这个简单的示例字符串比较就足够了。
  • @UlugToprak awk 在字段分隔数据中搜索匹配项时更易于使用

标签: bash awk


【解决方案1】:

在您的方法中,您没有得到列标题,因为它会打印行 只根据条件

$3 ~ /^1/ 

如果计算结果为 true(1),则打印 else(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

【讨论】:

  • 除非您有特定理由使用-F,否则请使用-v FS=","
  • 谢谢,“man awk”提到了-F 选项,但没有说明为什么最好使用-v FS=",",您能详细说明一下吗?
  • 最后,我使用了@sundeep 评论中的代码,但您的回答也很好。似乎不需要BEGIN 语句。
  • @PaulRougieux 。仅仅是因为 -F 在某些实现上不受支持,但 -v FS= 是可移植的。
  • @sjsam -F 是从命令行单独设置 FS 的首选方法(为了简洁起见),并且所有 awk 都支持,除了旧的、损坏的 awk(Solaris 上的 /bin/awk)应该切勿以任何理由被任何人使用。使用-v FS='...' 的唯一原因是,如果您还将-v OFS='...' 设置为与FS 不同的值,并且希望对两者使用相同的方法以保持一致性。
【解决方案2】:

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

你可以在你的脚本中做一些小改动来实现它:

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

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

【讨论】:

    猜你喜欢
    • 2013-11-03
    • 1970-01-01
    • 1970-01-01
    • 2012-09-02
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2020-10-08
    • 2020-12-20
    相关资源
    最近更新 更多