【问题标题】:How to take a hash of a line in CSV and add it as a last column如何在 CSV 中获取一行的哈希并将其添加为最后一列
【发布时间】:2025-11-28 14:05:02
【问题描述】:

我有一个文件:

cat test.csv
Unix,10,A
Linux,30,B
Solaris,40,C
Fedora,20,D
Ubuntu,50,E

我想把它改成这样:

Unix,10,A,f9be1a25bec3e55418e4f6a75a6bdceecb6d6d17af911d8b4ef478431edc68d2
Linux,30,B,659c957414b20e098c299a5769f0c05b225b7fef007cd0e71e0355f7bc8afe5c
Solaris,40,C,3189a15aa81b86277e8e910eeb17a2d6a4e52fbdcbf326034d7691471788b9b7
Fedora,20,D,14a0ae4fb2a3bd2209f60969d75bee5ca243921f02be8ffc0f37f2ea9354f0b2
Ubuntu,50,E,dc635842ca6f904ca658ec71b5d9205221664688eaa028917663ab9760e823c3

我正在尝试这样做:

while read line; 
do
  echo -n $line | openssl dgst -sha256 -hmac "SECRET" | cut -d' ' -f2
done < test.csv

它给了我想要的哈希值,但我不知道如何在最后添加哈希值。我正在查看名为 awk 的工具,但无法弄清楚。

【问题讨论】:

    标签: linux bash csv hash awk


    【解决方案1】:
    while read -r line
    do
      echo "$line","$(echo -n $line | openssl dgst -sha256 -hmac "SECRET" | cut -d' ' -f2)"
    done < test.csv
    

    这会产生输出:

    Unix,10,A,f9be1a25bec3e55418e4f6a75a6bdceecb6d6d17af911d8b4ef478431edc68d2
    Linux,30,B,659c957414b20e098c299a5769f0c05b225b7fef007cd0e71e0355f7bc8afe5c
    Solaris,40,C,3189a15aa81b86277e8e910eeb17a2d6a4e52fbdcbf326034d7691471788b9b7
    Fedora,20,D,14a0ae4fb2a3bd2209f60969d75bee5ca243921f02be8ffc0f37f2ea9354f0b2
    Ubuntu,50,E,dc635842ca6f904ca658ec71b5d9205221664688eaa028917663ab9760e823c3
    

    【讨论】:

    • +1 我本来会要求你避开你对 SECRET 的引用 - 但我今天测试了它并学到了一些新东西!
    【解决方案2】:

    paste 是一个方便的连接行的工具:首先按原样打印行,然后打印哈希,然后用逗号连接行:

    while read line; do
      echo "$line"
      echo -n "$line" | openssl dgst -sha256 -hmac "SECRET" | cut -d' ' -f2
    done < test.csv | 
    paste -d, - -
    
    Unix,10,A,f9be1a25bec3e55418e4f6a75a6bdceecb6d6d17af911d8b4ef478431edc68d2
    Linux,30,B,659c957414b20e098c299a5769f0c05b225b7fef007cd0e71e0355f7bc8afe5c
    Solaris,40,C,3189a15aa81b86277e8e910eeb17a2d6a4e52fbdcbf326034d7691471788b9b7
    Fedora,20,D,14a0ae4fb2a3bd2209f60969d75bee5ca243921f02be8ffc0f37f2ea9354f0b2
    Ubuntu,50,E,dc635842ca6f904ca658ec71b5d9205221664688eaa028917663ab9760e823c3
    

    【讨论】:

      【解决方案3】:

      这是awk。不知道为什么它会给出不同的hash,但它应该可以工作:

      awk '{cmd="echo -n \""$0"\" | openssl dgst -sha256 -hmac \"SECRET\"";cmd | getline var;close(cmd);sub(/.* /,"",var);print $0 "," var}' file
      Unix,10,A,f9be1a25bec3e55418e4f6a75a6bdceecb6d6d17af911d8b4ef478431edc68d2
      Linux,30,B,659c957414b20e098c299a5769f0c05b225b7fef007cd0e71e0355f7bc8afe5c
      Solaris,40,C,3189a15aa81b86277e8e910eeb17a2d6a4e52fbdcbf326034d7691471788b9b7
      Fedora,20,D,14a0ae4fb2a3bd2209f60969d75bee5ca243921f02be8ffc0f37f2ea9354f0b2
      Ubuntu,50,E,dc635842ca6f904ca658ec71b5d9205221664688eaa028917663ab9760e823c3
      

      或者这样写:

      awk '{
          cmd="echo -n \""$0"\" | openssl dgst -sha256 -hmac \"SECRET\""
          cmd | getline var
          close(cmd)
          sub(/.* /,"",var)
          print $0 "," var}
          ' test.csv
      

      【讨论】:

      • echo -n 将从末尾删除 \n 并且哈希将与所讨论的相同。
      【解决方案4】:

      @glenn,为什么需要粘贴?

      while read line
      do  
          echo -n "$line,"
          echo -n $line | openssl dgst -sha256 -hmac "SECRET" | cut -d' ' -f2
      done < test.csv
      

      【讨论】:

        最近更新 更多