【问题标题】:Get next field/column width awk获取下一个字段/列宽 awk
【发布时间】:2011-09-05 22:03:03
【问题描述】:

我有一个如下结构的数据集:

1234 4334 8677 3753 3453 4554
4564 4834 3244 3656 2644 0474
...

我想: 1) 搜索特定值,例如 4834 2)返回以下字段(3244)

我对 awk 很陌生,但意识到这是一个简单的操作。我创建了一个 bash 脚本,它要求用户输入,并尝试返回以下字段。 但我似乎无法绕过 AWK 的范围。如何将输入值解析为 awk?

#!/bin/bash
read input

cat data.txt | awk '
 for (i=1;i<=NF;i++) {
  if ($i==input) {       
   print $(i+1)
  }
 }
}'

提前干杯和感谢!

2011 年 9 月 8 日更新

感谢所有回复。

1) 永远不会选择行的最后一个数字 - 仍然感谢您指出这一点。

2) 我对 awk 有一个更普遍的问题。通常我想用找到的结果“做点什么”。在这种情况下,我想将它输出到 xclip - 从标准输入读取并将其复制到剪贴板的应用程序。例如: $回声嗨|剪辑

不幸的是,awk 不存在回显,所以我需要返回值并回显它。你会怎么做呢?

【问题讨论】:

  • 两个'{';三 '}';不是幸福的秘诀。另外,如果要查找的值是 4554,该怎么办?

标签: bash function awk arguments


【解决方案1】:
#!/bin/bash
read input

cat data.txt | awk '{
 for (i=1;i<=NF;i++) {
  if ($i=='$input') {       
   print $(i+1)
  }
 }
}'

【讨论】:

  • 哈哈!这很简单 :) 是否可以将结果保存到变量中,然后再对其进行处理?我想将结果复制到剪贴板: print $(i+1) | xclip -选择剪贴板
【解决方案2】:

别想太多!

您可以在 awk 中使用split 命令创建一个数组:

split($0, ary)

这会将$0 行拆分为一个名为ary 的数组。现在,您可以使用数组语法来查找特定字段:

awk '{
    size = split($0, ary)
    for (i=1; i < size ;i++) {
        print ary[i]
    }
    print "---"
}' data.txt

现在,当您找到 ary[x] 作为字段时,您可以打印出 ary[x+1]。

在你的例子中:

awk -v input=$input '{
   size = split($0, ary)
   for (i=1; i<= size ;i++) {
       if ($i == ary[i]) {       
           print ary[i+1]
       }
  }
}' data.txt

有一种方法可以在不创建数组的情况下做到这一点,但在这种情况下使用数组会容易得多。

顺便说一句,您可以通过将文件名放在awk 语句之后来消除cat 命令,并节省创建无关进程。每个人都知道创建一个无关的进程会杀死一只小猫。请不要杀死小猫。

【讨论】:

  • 感谢您的详尽解释!总是很高兴学习一种更有效的编码方式! :) 会玩弄这个。
【解决方案3】:

您使用-v 选项将shell 变量传递给awk。它比必须加上引号更干净/更好。

awk -v input="$input" '
   for(i=1;i<=NF;i++){
      if ($i == input ){
         print "Next value: " $(i+1)
      }
   }
' data.txt

丢掉没用的cat

【讨论】:

    【解决方案4】:

    这是我的解决方案:删除搜索字段之前(包括)的所有内容,然后您要打印的字段是字段 #1 ($1):

    awk '/4834/ {sub(/^.* * 4834 /, ""); print $1}' data.txt
    

    【讨论】:

      猜你喜欢
      • 2013-07-29
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2014-06-24
      • 2019-09-23
      • 1970-01-01
      相关资源
      最近更新 更多