首页 > 解决方案 > 用于检查文件中是否存在特定字符串的 awk 命令,如果存在则返回该字符串存在的列名

问题描述

使用以下 awk 命令,我可以检查文件中是否存在特定字符串。

grep -R "statistics" <Filename>

但我正在寻找的输出是我需要找出这个字符串所在的列。有没有办法扩展这个命令,以便它可以返回这个字符串所在的列名。

我尝试了以下命令,但没有得到所需的输出

awk '{ for (i=1; i<=NF; ++i) { if ($i = "statistics") print i } }' <filename>

我的输入文件中有大约 1500 列。它是一个包含列标题的制表符分隔文件。

感谢任何指导。

标签: shellunixawkgrep

解决方案


第一个解决方案:您能否尝试以下操作。

awk '
FNR==1{
  for(i=1;i<=NF;i++){
    array[i]=$i
  }
}
{
  for(i=1;i<=NF;i++){
    if($i=="statistics"){
      print "Line number is: " FNR ", column number is: "i ",column heading is:" array[i]
    }
  }
}
' Input_file

第二种解决方案:使用具有我们要搜索的字符串值的变量。

awk -v word="statistics" '
FNR==1{
  for(i=1;i<=NF;i++){
    array[i]=$i
  }
}
{
  for(i=1;i<=NF;i++){
    if($i==word){
       print "Line number is: " FNR ", column number is: "i",column heading is:" array[i]
    }
  }
}' Input_file

以上两种解决方案都将打印行号和列号。



第三种解决方案:要仅打印列号,请尝试以下操作:

awk 'FNR==1{for(i=1;i<=NF;i++){array[i]=$i}} {for(i=1;i<=NF;i++){if($i=="statistics"){print i,array[i]}}}' Input_file

第四种解决方案:采用可变方法的第三种解决方案的变体。

awk -v word="statistics" 'FNR==1{for(i=1;i<=NF;i++){array[i]=$i}}{for(i=1;i<=NF;i++){if($i==word){print i,array[i]}}}' Input_file

笔记:

  • 第一个和第二个解决方案将给出行号、列号和标题名称。
  • 第三和第四个解决方案将给出列号和标题名称。

推荐阅读