【发布时间】:2016-12-07 18:44:02
【问题描述】:
我正在尝试按列名投影 TSV 文件。到目前为止,我从一个关于 SO 的问题中获得灵感,我正在使用这个脚本,t.awk:
BEGIN {
OFS="\t"
split(cols,out,",")
}
NR==1 {
for (i=1; i<=NF; i++)
ix[$i] = i
}
NR>1 {
for (i=1;i<=length( out);i++)
printf "%s%s", $ix[out[i]], OFS
print ""
}
我可以这样调用:
awk -f t.awk -v cols=name1,name2,nameN input.tsv
它工作得很好,除非cols 属性指定的名称之一不存在。
如何修改它以使其在这种情况下也能正常工作?我希望它只是忽略作为参数传递的任何不存在的列名。
示例(编辑): 考虑 input.tsv:
a b c
1 2 3
2 3 4
5 6 7
我想要命令:
awk -f t.awk -v cols=a,c,batman input.tsv
生产:
a c
1 3
2 4
5 7
但是,到目前为止,它给出了:
awk: illegal field $(), name "batman"
【问题讨论】:
-
您能否提供一个示例数据,让我们知道什么是不工作的?
-
您使用的是哪个
awk版本?GNU Awk 4.1.3为示例调用生成一些随机输出。 -
目前我在 MacOS 上,它报告:awk 版本 20070501