的Linux shell脚本:从标准输入传递变量的awk

问题描述:

我有结构化的这样一个逗号分隔的.txt文件:的Linux shell脚本:从标准输入传递变量的awk

ABC,NAME1,LASTNAME1 
DEF,NAME2,LASTNAME2 
GHI,NAME3,LASTNAME3 

在运行时:

$ ./script.sh file.txt 

#!/bin/bash 
awk -F, '/NAME1/{print $3}' "$1" 

我得到我想要的输出:

LASTNAME1 

当试图通过将变量传递给awk来代替NAME1时:

$ ./script.sh file.txt NAME1 

#!/bin/bash 
awk -v n="$2" -F, '/$n/{print $3'} "$1" 

我根本没有得到任何输出。我检查了一下,在bash中输入的$2确实是NAME1。我错过了什么?在awk中

变量名是$前缀, 所以应该只是n代替$n。 另外,您不能使用/.../表达式中的变量。 你可以这样写:

awk -v n="$2" -F, '$0 ~ n {print $3}' "$1" 

顺便说一句,如果n参数应在第2列完全匹配的值, 那么最好使用精确的匹配条件与==$2

awk -v n="$2" -F, '$2 == n {print $3}' "$1" 
+0

啊,我明白了!所以,这个awk命令意味着:在我的研究中,在第1列($ 0)中搜索并且如果pattern(n)匹配(〜),打印...“?我还发现,$ 0意味着第一行?这是正确的 – Shushiro

+0

@ Shushiro'$ 0'表示整个当前行。 – janos