【问题标题】:Get individual k,v fields from a single line in bash script从 bash 脚本中的一行获取单个 k,v 字段
【发布时间】:2012-03-11 15:44:04
【问题描述】:

我以这种形式读取了一行数据:

KEYNAME:value,KEYNAME:value,KEYNAME:value

(请注意键是不带空格的字符串,值是整数)

我需要选择一些特定的键(不知道它们的相对位置)并在不同的行上打印它们的值:

value
value
value

到目前为止,我想到了将输入行转换为多个 KEY:value 行、grepping 我想要的键、强加已知顺序并最终通过 cut 再次删除关键部分的方法:

sed 's/,/\n/g' | egrep '(FooKey|BarKey|BazKey)' | sort | cut -d':' -f2

我以为我可以用 awk 安排一些东西,其中我只知道基础知识,但我只能按位置顺序管理字段,而不是按名称(键名)。

可以使用其他语言(即 Python 或 Perl)来完成,但我将其作为练习来使用常用的 shell 工具来完成所有事情。此外,我仍然更喜欢上述解决方案,而不是加载更大的解释器,如 python 或 perl。

【问题讨论】:

    标签: shell command-line awk grep


    【解决方案1】:

    这将只打印值:

    awk 'BEGIN { RS=","; FS=":" } { print $2 }'
    

    如果您希望这些值按特定顺序排列,您可以将它们放在一个数组中:

    awk '
        BEGIN { RS=","; FS=":" }
        { values[$1] = $2 }
        END {
            print values["FooKey"];
            print values["BarKey"];
        }'
    

    【讨论】:

    • 我知道 awk 或其他东西能够处理这个问题。感谢您的解决方案:)
    【解决方案2】:
    awk 'BEGIN { FS=":"; RS = ","; } /FooKey|BarKey|BazKey/ { print $1 }'
    

    【讨论】:

    • 你可能想要:awk -F: -v RS=, '$1=="FooKey"||$1=="BarKey"||$1=="BazKey" {print $2}'
    • 是的,这是一个 $2 让它打印值而不是键,但是这个解决方案不能在输出上保持给定的顺序(甚至改变 /FooKey|BarKey|BazKey/ 的输出顺序仍然遵循字段在输入中的排序方式)。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2014-02-02
    • 1970-01-01
    • 2017-07-03
    • 2023-01-13
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多