Bash awk和md5:替换列

Bash awk和md5:替换列,bash,awk,md5,Bash,Awk,Md5,从开始,我尝试散列(md5)一个数字列表: $ cat -n file 1 40755462755 2 40751685373 3 40730094339 4 40722740446 5 40722740446 6 40743802204 7 40730094339 8 40745188886 9 40740593352 10 40745561530 如果我跑步: cat file | awk '{cmd="echo -n " $1 " | md5sum|

从开始,我尝试散列(md5)一个数字列表:

$ cat -n file
 1  40755462755
 2  40751685373
 3  40730094339
 4  40722740446
 5  40722740446
 6  40743802204
 7  40730094339
 8  40745188886
 9  40740593352
10  40745561530
如果我跑步:

cat file | awk '{cmd="echo -n " $1 " | md5sum|cut -d\" \" -f1"; cmd|getline md5; $1=md5;print;}' | cat -n
 1  29ece26ce4633b6e9480255db194cc40
 2  120148eca0891d0fc645413d0f26b66b
 3  cafc48d392a004f75b669f9d1d7bf894
 4  7b4367e8f58835c0827dd6a2f61b7258
 5  7b4367e8f58835c0827dd6a2f61b7258
 6  49b12d1f3305ab93b33b330e8b1d3165
 7  49b12d1f3305ab93b33b330e8b1d3165
 8  bee44c89ac9d4e8e4e1f1c5c63088c71
 9  f07262ac8f53755232c5abbf062364d0
10  2ac7c22170c00a3527eb99a2bfde2c2c
我不知道为什么7号线的md5与6号线相同,因为如果我单独运行它们,它们是不同的:

$ echo -n 40743802204 | md5sum|cut -d" " -f1
49b12d1f3305ab93b33b330e8b1d3165
$ echo -n 40730094339 | md5sum|cut -d" " -f1
cafc48d392a004f75b669f9d1d7bf894
我试了一些指纹:

cat file| awk '{print $0,NF,NR;cmd="echo -n " $1 " | md5sum|cut -d\" \" -f1"; cmd|getline md5; $1=md5"---"cmd"---"$1;print;}' | cat -n
但是没有成功地发现哪里出了问题


编辑:如标题所示,我尝试替换文件中的一列(一个包含100个字段的文件)。因此,$1将是$24,NF将是一个文件的120,另一个文件的233。

我猜,但无法判断,因为您没有测试它的返回代码,这是因为您的
getline
在第7行失败,所以
md5
具有与前一行相同的值。
getline
的使用充满了警告,初学者不能使用,请参阅


与仅仅呆在shell中相比,使用awk有什么价值呢?

所有的引用都有点尴尬-我不知道为什么它会不诚实。但这里有一些使用较少awk且工作正常的东西:

< tmp | while read num ; do echo -n $num | md5sum | cut -f1 -d' '; done | cat -n
读取num时的
我不会在
awk
中那样使用
getline
。你可以做:

while read -r num; do 
    echo -n $num | md5sum | cut -d ' ' -f1; 
done < file
29ece26ce4633b6e9480255db194cc40
120148eca0891d0fc645413d0f26b66b
cafc48d392a004f75b669f9d1d7bf894
7b4367e8f58835c0827dd6a2f61b7258
7b4367e8f58835c0827dd6a2f61b7258
49b12d1f3305ab93b33b330e8b1d3165
cafc48d392a004f75b669f9d1d7bf894
bee44c89ac9d4e8e4e1f1c5c63088c71
f07262ac8f53755232c5abbf062364d0
2ac7c22170c00a3527eb99a2bfde2c2c
读取时-r num;做
echo-n$num | md5sum | cut-d'-f1;
完成<文件
29ece26ce4633b6e9480255db194cc40
120148eca0891d0fc645413d0f26b66b
cafc48d392a004f75b669f9d1d7bf894
7b4367e8f58835c0827dd6a2f61b7258
7b4367e8f58835c0827dd6a2f61b7258
49b12d1f3305ab93b33b330e8b1d3165
cafc48d392a004f75b669f9d1d7bf894
bee44c89ac9d4e8e4e1f1c5c63088c71
F07262AC8F5375232C5ABBF062364D0
2ac7c22170c00a3527eb99a2bfde2c2c

好的,我发现了问题。awk中的管道应关闭。 所以,我需要一个
close(cmd)


我发现解决办法很好。我是否可以建议将命令变量
tmp
重新命名为
cmd
,以便更清楚它是什么,并且它与文件
tmp
的名称不同?此外,您不需要像awk一样轻松地打开文件那样使用
cat
,也不需要像awk可以拆分文本那样使用
cut
awk'{cmd=“echo-n”$1”| md5sum;cmd | getline md5;close(cmd);sub(/.*/,“”,md5);$1=md5;print}tmp