我正在开发一个shell脚本,里面有很多SED和AWK命令。现在,我被困在一个无法继续前进的地方。
例如: - 如果我运行以下命令。它打印第一列。
<div class="content">\s*(.*?)\s*</div>
但是,有没有办法使用列名而不是列号打印特定列。猜猜没有直接的方法去做,但应该有一些技巧来做到这一点。
样本数据(标签分隔)
awk 'OFS="\t" {print $1;}' finename.txt
答案 0 :(得分:3)
这样的东西?
awk -vcol=Price '(NR==1){colnum=-1;for(i=1;i<=NF;i++)if($(i)==col)colnum=i;}{print $(colnum)}' filename.csv
我应该解释一下:
-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
的输出进行了排序
(对这个问题来说,这不是一个更好的答案,但我认为人们会更欣赏它。)