获取下一个字段/列宽awk

时间:2011-09-05 22:03:04

标签: bash function awk arguments

我有以下结构的数据集:

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

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

我对awk很新,但意识到这是一个简单的操作。我创建了一个bash-script,要求用户输入,并尝试返回以下字段。 但我似乎无法绕过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 - 一个从标准输入读取并将其复制到剪贴板的应用程序。例如: $ echo嗨| xclip

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

4 个答案:

答案 0 :(得分:4)

#!/bin/bash
read input

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

答案 1 :(得分:1)

不要过度思考!

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

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

有一种方法可以在不创建数组的情况下执行此操作,但在这种情况下使用数组会更容易。

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

答案 2 :(得分:0)

使用-v选项将shell变量传递给awk。它更干净/更好,而不是必须报价。

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

失去无用的cat

答案 3 :(得分:0)

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

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