我有一个多列文本文件,其标题位于第一行,如下所示
Name xy_fill zxy_fill tz_fill
Fox 0 5 55
Snake 1 6 14
wolf 8 1 2
标头存储在名为 的数组中hdr
。其中包含xy_fill tz_fill
我想hdr
从该多列文本文件中搜索该数组的每个元素。我正在使用这种awk
方法
for ii in ${hdr[@]}
do
gawk -vcol="$ii" -F $'\t' '
$0 ~ col{
for(s=1;s<=NF;s++){
heading=$s
colhdr[s]=heading
if(index(heading, col))wanted[s]=1
}
}
'
done
但是,在搜索时,这给了我xy_fill
和列。我怎么才能只读取列呢?例如,如果我搜索,它应该返回列号 1,但我的脚本返回 1 和 2,这是错误的。zxy_fill
xy_fill
xy_fill
xy_fill
答案1
使用csvcut
来自csvkit
:
# if file is tab-delimited:
csvcut -t -c xy_fill,tz_fill file
# if file is space-delimited
csvcut -d' ' -S -c xy_fill,tz_fill file
要使用数组作为输入,您需要将其转换为逗号分隔价值观:
hdr=(xy_fill tz_fill)
hdr_csv=$(IFS=,;echo "${hdr[*]}")
csvcut -t -c "$hdr_csv" file # tab-delimited
# or
csvcut -d' ' -S -c "$hdr_csv" file # space-delimited
| csvformat -T
如果您希望输出再次以制表符分隔,请在末尾添加。
输出:
xy_fill tz_fill
0 55
1 14
8 2
答案2
$ awk -v tgt='xy_fill' 'NR==1{for (i=1;i<=NF;i++) f[$i]=i} {print $(f[tgt])}' file
xy_fill
0
1
8
答案3
如果你只想要xy_fill
为什么不简单呢awk '{print $2}' testfile
?