使用 awk 进行表查找

发布于 2024-10-06 07:02:17 字数 198 浏览 2 评论 0原文

我想使用 awk 从文本文件中查找值。文本文件的格式非常简单:

text \t value
文本\t值
文本\t值
...

我想传递应通过 shell 变量查找其值的实际文本,例如 $1。

我有什么想法可以用 awk 来做到这一点吗?

非常感谢您的帮助。

一切顺利, 阿尔贝托

I would like to use awk to lookup a value from a text file. The text file has a very simple format:

text \t value
text \t value
text \t value
...

I want to pass the actual text for which the value should be looked up via a shell variable, e.g., $1.

Any ideas how I can do this with awk?

your help is great appreciated.

All the best,
Alberto

如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。

扫码二维码加入Web技术交流群

发布评论

需要 登录 才能够评论, 你可以免费 注册 一个本站的账号。

评论(4

庆幸我还是我 2024-10-13 07:02:17

您可以在没有 shell 包装器的纯 AWK 脚本中执行此操作:

#!/usr/bin/awk -f
BEGIN { key = ARGV[1]; ARGV[1]="" }
$1 == key { print $2 }

像这样调用它:

./lookup.awk keyval lookupfile

示例:

$ cat lookupfile
aaa     111
bbb     222
ccc     333
ddd     444
zzz     999
mmm     888
$ ./lookup.awk ddd lookupfile
444
$ ./lookup.awk zzz lookupfile
999

甚至可以扩展为使用参数选择所需的字段。

#!/usr/bin/awk -f
BEGIN { key = ARGV[1]; field = ARGV[2]; ARGV[1]=ARGV[2]="" }
$1 == key { print $field }

例子:

$ cat lookupfile2
aaa     111     abc
bbb     222     def
ccc     333     ghi
ddd     444     jkl
zzz     999     mno
mmm     888     pqr
$ ./lookupf.awk mmm 1 lookupfile2
mmm
$ ./lookupf.awk mmm 2 lookupfile2
888
$ ./lookupf.awk mmm 3 lookupfile2
pqr

You can do this in a pure AWK script without a shell wrapper:

#!/usr/bin/awk -f
BEGIN { key = ARGV[1]; ARGV[1]="" }
$1 == key { print $2 }

Call it like this:

./lookup.awk keyval lookupfile

Example:

$ cat lookupfile
aaa     111
bbb     222
ccc     333
ddd     444
zzz     999
mmm     888
$ ./lookup.awk ddd lookupfile
444
$ ./lookup.awk zzz lookupfile
999

This could even be extended to select the desired field using an argument.

#!/usr/bin/awk -f
BEGIN { key = ARGV[1]; field = ARGV[2]; ARGV[1]=ARGV[2]="" }
$1 == key { print $field }

Example:

$ cat lookupfile2
aaa     111     abc
bbb     222     def
ccc     333     ghi
ddd     444     jkl
zzz     999     mno
mmm     888     pqr
$ ./lookupf.awk mmm 1 lookupfile2
mmm
$ ./lookupf.awk mmm 2 lookupfile2
888
$ ./lookupf.awk mmm 3 lookupfile2
pqr
夜巴黎 2024-10-13 07:02:17

像这样的事情就可以完成这项工作:

#!/bin/sh
awk -vLOOKUPVAL=$1 '$1 == LOOKUPVAL { print $2 }' < inputFile

本质上,您将 $1 中传递到 shell 脚本的查找值设置为 awk 变量,然后您可以在 awk 本身中访问它。澄清一下,第一个 $1 是在命令行中传入的 shell 脚本参数,第二个 $1 (以及后续的 $2)是输入文件的字段 1 和 2。

Something like this would do the job:

#!/bin/sh
awk -vLOOKUPVAL=$1 '$1 == LOOKUPVAL { print $2 }' < inputFile

Essentially you set the lookup value passed into the shell script in $1 to an awk variable, then you can access that within awk itself. To clarify, the first $1 is the shell script argument passed in on the command line, the second $1 (and subsequent $2) are fields 1 and 2 of the input file.

水水月牙 2024-10-13 07:02:17
TEXT=`grep value file | cut -f1`
TEXT=`grep value file | cut -f1`
鱼忆七猫命九 2024-10-13 07:02:17

我认为 grep 实际上可能更适合:

$ echo "key value
ambiguous correct
wrong ambiguous" | grep '^ambiguous ' | awk ' { print $2 } '

模式上的 ^ 是为了匹配行的开头,并确保您不匹配值(而不是键)是所需文本的行。

I think grep might actually be a better fit:

$ echo "key value
ambiguous correct
wrong ambiguous" | grep '^ambiguous ' | awk ' { print $2 } '

The ^ on the pattern is to match to the start of the line and ensure that you don't match a line where the value, rather than the key, was the desired text.

~没有更多了~
我们使用 Cookies 和其他技术来定制您的体验包括您的登录状态等。通过阅读我们的 隐私政策 了解更多相关信息。 单击 接受 或继续使用网站,即表示您同意使用 Cookies 和您的相关数据。
原文