如何在列标题中搜索与该单词完全匹配而不是部分匹配的单词?

如何在列标题中搜索与该单词完全匹配而不是部分匹配的单词?

我有一个多列文本文件,其标题位于第一行,如下所示

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_fillxy_fillxy_fillxy_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

相关内容