我有以下结构的数据集:
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,所以我需要返回值并回显它。你会怎么做?
答案 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