【问题标题】:get the column matching a word in awk获取与 awk 中的单词匹配的列
【发布时间】:2019-07-12 09:46:32
【问题描述】:

我想使用 awk 获取列名称为注释的 excel 文件的列。例如我有

data number annotation.1.2
1     2      where can I go
4     5      where can I see this flim
6     7      I want to see this movie.

awk '$3 ~ /annotation/ { print }' toto

如果第三列是注释,我的代码可以工作,但我还有一些其他文件,其中注释位于第五列的第四列。有什么方法可以仅作为模式给出 annotation.1.3 吗?

使用下面的代码,我只收到 film can where

【问题讨论】:

  • 注释总是在最后一列吗?如果不是,那么您也应该让我们知道一些其他逻辑,通过这些逻辑我们可以认识到它的值可以有多长?或者直到我们需要获取它的值时,我们可以获取它的列号,但是您的样本显示您的值之间有空格,在这种情况下,我们需要知道获取完整值的确切逻辑,所以请告诉我们。跨度>

标签: shell awk


【解决方案1】:

编辑: 由于 OP 更改了要求并告知 Input_file 是 TAB 分隔的,并且 annotations 字段的长度不固定,因此现在添加以下解决方案。

awk '
BEGIN{
  FS="\t"
}
FNR==1{
  for(i=1;i<=NF;i++){
    if($i~/annotation/){
       val=i
       next
    }
  }
}
match($val,/[^\t]*/){
  print substr($val,RSTART,RLENGTH)
}
'  Input_file


您能否尝试以下操作(根据 OP 的示例编写和测试)。

awk 'FNR==1{for(i=1;i<=NF;i++){if($i=="annotation"){val=i;next}}} {print $val}' Input_file

如果您有不同的分隔符,如 TAB,则将上述代码中的 awk 更改为 awk -v FS="\t"

【讨论】:

  • 它也削减了我在这个专栏中的数据。我有不同的句子,但我只收到几个单词。
  • @oezlem,请多解释,我只是根据您提供的示例编写和测试代码,请更清楚。
  • 这是一个很好的答案 ++ OP 可能有不同的分隔符而不是空格。
  • 谢谢你,Ravinder 成功了,如果你有时间可以给我解释一下吗?我正在努力学习
  • @oezlem wrt This is an excel file - 您无法使用 awk 解析 excel 文件。您可以解析制表符分隔或逗号分隔的文件,因为可以从 Excel 导出。那是你正在使用的东西还是其他东西?当您说it only has spaces 时,您的意思是您感兴趣的字段只有空白字符,而每一行都是制表符分隔的字段或其他内容?
猜你喜欢
  • 2018-10-11
  • 1970-01-01
  • 2022-11-17
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2013-06-04
  • 2021-03-25
  • 2021-08-18
相关资源
最近更新 更多