AWK,SED根据列名显示列

时间:2015-08-02 15:30:36

标签: bash shell awk sed

我正在开发一个shell脚本,里面有很多SED和AWK命令。现在,我被困在一个无法继续前进的地方。

例如: - 如果我运行以下命令。它打印第一列。

<div class="content">\s*(.*?)\s*</div>

但是,有没有办法使用列名而不是列号打印特定列。猜猜没有直接的方法去做,但应该有一些技巧来做到这一点。

样本数据(标签分隔)

awk 'OFS="\t" {print $1;}' finename.txt

2 个答案:

答案 0 :(得分:3)

这样的东西? awk -vcol=Price '(NR==1){colnum=-1;for(i=1;i<=NF;i++)if($(i)==col)colnum=i;}{print $(colnum)}' filename.csv

我应该解释一下:

  • -v设置变量,因此-vcol=Price我声明了我正在寻找的列。
  • (NR==1)选择第一行和代码,然后搜索我们要打印的列标题。
  • 最后我们打印专栏。

对于多列,方法类似:

awk -F'\t' -vcols=fun,coming '(NR==1){n=split(cols,cs,",");for(c=1;c<=n;c++){for(i=1;i<=NF;i++)if($(i)==cs[c])ci[c]=i}}{for(i=1;i<=n;i++)printf "%s" FS,$(ci[i]);printf "\n"}' filename.csv

答案 1 :(得分:0)

感谢@Max Murphy。

个人需要awk -f' '(因此需要空格)和| column -t

完整:

awk -F' ' -vcols=pkts,bytes,source,destination '(NR==2){n=split(cols,cs,",");for(c=1;c<=n;c++){for(i=1;i<=NF;i++)if($(i)==cs[c])ci[c]=i}}{for(i=1;i<=n;i++)printf "%s" FS,$(ci[i]);printf "\n"}' | column -t

我用它在Debian上对iptables -L -n -v --line-numbers的输出进行了排序

(对这个问题来说,这不是一个更好的答案,但我认为人们会更欣赏它。)