【问题标题】:Linux shell script: Pass variable from stdin to awk [duplicate]Linux shell脚本:将变量从标准输入传递到awk [重复]
【发布时间】:2018-04-09 20:19:57
【问题描述】:

我有一个逗号分隔的 .txt 文件,其结构如下:

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。我错过了什么?

【问题讨论】:

    标签: linux bash shell awk


    【解决方案1】:

    Awk 中的变量名$ 为前缀, 所以它应该只是n 而不是$n。 此外,您不能在 /.../ 表达式中使用变量。 你可以这样写:

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

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

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

    【讨论】:

    • 啊,我明白了!所以,这个 awk 命令的意思是:在第 1 列中搜索 ($0),如果模式 (n) 匹配 (~),则打印..."?在我的研究中,我还发现 $0 表示第一行?这是正确的跨度>
    • @Shushiro $0 表示整个当前行。
    猜你喜欢
    • 2016-09-17
    • 2015-03-26
    • 2012-04-15
    • 2014-03-11
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多