Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/video/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
使用awk进行表查找_Awk - Fatal编程技术网

使用awk进行表查找

使用awk进行表查找,awk,Awk,我想使用awk从文本文件中查找值。文本文件的格式非常简单: 文本\t值 文本\t值 文本\t值 ... 我希望传递实际文本,通过shell变量(例如$1)查找该文本的值 你知道我怎么用awk做这个吗 非常感谢你的帮助 祝你一切顺利, 阿尔贝托像这样的东西可以胜任这项工作: #!/bin/sh awk -vLOOKUPVAL=$1 '$1 == LOOKUPVAL { print $2 }' < inputFile #/垃圾箱/垃圾箱 awk-vLOOKUPVAL=$1'$1==LOO

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

文本\t值
文本\t值
文本\t值
...

我希望传递实际文本,通过shell变量(例如$1)查找该文本的值

你知道我怎么用awk做这个吗

非常感谢你的帮助

祝你一切顺利,
阿尔贝托

像这样的东西可以胜任这项工作:

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

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

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

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

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

您可以在纯AWK脚本中执行此操作,而无需shell包装器:

#!/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
$ 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
这甚至可以扩展到使用参数选择所需的字段

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

$ cat lookupfile
aaa     111
bbb     222
ccc     333
ddd     444
zzz     999
mmm     888
$ ./lookup.awk ddd lookupfile
444
$ ./lookup.awk zzz lookupfile
999
$ 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

感谢您的帮助-除了对语法的最小更改:awk'$1==LOOKUPVAL{print$2}'LOOKUPVAL=$1 inputfile我在shell脚本中引用$1:
awk-v“LOOKUPVAL=$1”…
注意,如果tab显式地是字段分隔符,并且如果您的任何字段都可以包含空格,您必须指定tab作为字段分隔符:
awk-F'\t'…
I不同意。awk完全能够自己完成这一切