gpt4 book ai didi

unix - 结合 awk 和 csum 来散列一个字段

转载 作者:行者123 更新时间:2023-12-04 05:06:39 24 4
gpt4 key购买 nike

我有管道分隔的文本文件,需要特定字段或字段集的 MD5 哈希。因为我在 AIX 上并且必须使用 csum 函数,所以我认为我不能简单地将文件和散列函数传递给 awk 来一举完成。

所以我正在编写一个脚本来读取每一行,将要散列的字段传递给 csum,然后通过 gsub 将结果放回作为替换。 99% 的时间它似乎工作正常,但有时会出现问题,因为 gsub 替换了它不应该的东西。

#!/bin/ksh
rm $2 #Get rid of output file
while read line; do #loop through each line
MYFIELD=$(echo "$line" | cut -d "|" -f 6); #push the 6th field into a var
MYHASH=$(echo $MYFIELD | csum -h MD5 -); #csum will hash a string only on the stdin
echo $line | sed -e "s/$MYFIELD/${MYHASH}/g" >> $2 #gsub replaces, but not always what we want
done < $1 #read in the input file

我认为我可以使用 awk 来更新该字段。但我无法一次完成一行。理想情况下,我想要一个脚本,允许我传递两个强制性参数(infile 和 outfile),然后传递任意数量的将被散列和替换的字段位置。啦啦
foo infile.txt outfile.txt 2 6 12

它将读取 infile.txt,散列字段 2、6 和 12,然后写出到 outfile.txt。
您的建议将不胜感激

最佳答案

awk 怎么样? ?

而不是

echo $line | sed -e "s/$MYFIELD/${MYHASH}/g" >> $2 #gsub replaces, but not always what we want

你可以使用
old=$MYFIELD; new=$MYHASH; echo $line | awk -F"|" -v o="$old" -v n="$new" '{OFS=FS} sub(o, n, $6) {print}' >> $2

基本上我们要做的是:
  • old=$MYFIELD; new=$MYHASH我们将要发送的参数分配给 awk .
  • echo $line我们输出该行以便 awk 可以得到它。

  • 在 awk 中,
  • -F"|"定义 |作为字段分隔符。
  • -v o="$old"-v n="$new"让 awk 处理变量 $old$new命名它们 on分别。
  • {OFS=FS} - 定义字段之间的分隔符。也可以是 OFS="|" ,但这样我们表示 awk使用我们在 -F="|" 上定义的相同内容.保留字段分隔符以防它发生变化更灵活。
  • sub(o, n, $6)替换变量 o 上的文本(即 $MYFIELD )在变量 v 上带有文本(即 $MYHASH ),但是 只是 在第 6 场。
  • print带有替换文本的整行

  • 这在您给出的评论示例中对我有用:
    old="hashit"; new="WE_DID"; echo "donthashit|foo1|bar1|foo2|bar2|hashit" | awk -F"|" -v o="$old" -v n="$new" '{OFS=FS} sub(o,n,$6) {print}'
    donthashit|foo1|bar1|foo2|bar2|WE_DID

    希望它有帮助。

    编辑
    found a way轻松地将变量传递给 awk: -v o=${variable_name}
    这样,解决方案可以是:
    echo $line | awk -F"|" -v o=${MYFIELD} -v n=${MYHASH} '{OFS=FS} sub(o, n, $6) {print}' >> $2

    关于unix - 结合 awk 和 csum 来散列一个字段,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/15453219/

    24 4 0
    Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
    广告合作:1813099741@qq.com 6ren.com