【问题标题】:using awk to get column values and then running another command on values and printing them使用 awk 获取列值,然后对值运行另一个命令并打印它们
【发布时间】:2013-07-18 14:16:16
【问题描述】:

我一直使用 Stack Overflow 来解决问题,但这是我的第一篇文章。我是 UNIX 脚本的新手,我被分配了一项任务来获取第二列的值,然后对它们运行命令。我想运行的命令是 'echo -n "$2" | openssl dgst -sha1;'这是一个散列值的函数。我的问题不是散列一个值,而是将它们全部散列然后打印它们。有人可以帮我解决这个问题吗?这就是我开始的方式,但我认为我要走的路是错误的。

注意:这是一个 CSV 文本文件,我知道我需要为此使用 AWK 命令。

awk 'BEGIN { FS = "," } ; { print $2 }'
     while [ "$2" != 0 ];
     do
         echo -n "$2" | openssl dgst -sha1
     done

这将完整打印第二列,并打印某种类型的散列值。

抱歉,第一篇文章太长了,只是想尽可能具体。谢谢!

【问题讨论】:

    标签: unix hash scripting awk


    【解决方案1】:

    您并不真的需要 awk 来提取第二列。您可以使用内置的bash read 并将IFS 设置为分隔符。

    while IFS=, read -ra line; do
    [[ ${line[1]} != 0 ]] && echo "${line[1]}" | openssl dgst -sha1
    done < inputFile
    

    您可能应该发布一些示例输入数据和您遇到的错误,以便有人可以更好地调试您现有的代码。

    【讨论】:

    • 这似乎符合我的要求。假设我也想打印其他列并将其添加为新列,那么我是否必须使用 awk?再次感谢!
    • @RyanOuellette,不,您已经拥有所需的所有值:(( ${line[1]} != 0 )) &amp;&amp; sha=$(openssl dgst -sha1 &lt;&lt;&lt; "${line[1]}") || sha=""; printf "%s," "${line[@]}"; echo "$sha"
    • 太棒了,这看起来像是我问题的第二部分。碰巧知道为什么哈希的重复输出? for instance: ` 1654353205839179796,2083,7051,95230376,-1,53211239,2286,Mon Jul 01 13:30:02 PDT 2013 (stdin)= 29957e719443bb2580bebd604693afbdb3b5d53f,(stdin)= 29957e719443bb2580bebd604693afbdb3b5d53f `
    • @glennjackman 看来它现在的工作很奇怪。不知道为什么它打印我昨天上面所说的值。非常感谢你的帮助!顺便说一句...什么涂料 line[@] 做什么?它是否正在查看它当前在循环中的线路?再次感谢
    【解决方案2】:

    这样就可以了:

    $ awk '{print $2}' file | xargs -n1 openssl dgst -sha1
    

    使用awk 打印文件中的第二个字段,使用xargs-n1 分别将每条记录传递给openssl

    如果CSV 是指每条记录用逗号分隔,那么您需要将-F, 添加到awk

    $ awk -F, '{print $2}' file | xargs -n1 openssl dgst -sha1
    

    【讨论】:

    • 我喜欢它的发展方向,这似乎与我想做的事情有些相同,但由于某种原因,当我执行脚本时它不会读取文件。似乎在原始列数据的右侧找不到目录
    猜你喜欢
    • 2019-03-28
    • 1970-01-01
    • 1970-01-01
    • 2013-06-28
    • 2015-05-23
    • 1970-01-01
    • 2022-01-18
    • 2020-10-31
    • 1970-01-01
    相关资源
    最近更新 更多