awk和md5:替换列

时间:2014-05-16 13:43:41

标签: bash awk md5

Awk replace a column with its hash value开始,我试图哈希(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行获得与第6行相同的md5,因为如果我单独运行它们则不同:

$ 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个是另一个文件。

4 个答案:

答案 0 :(得分:3)

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

我找到了解决方案here

答案 1 :(得分:2)

我不会在getline中使用awk。你可以这样做:

while read -r num; do 
    echo -n $num | md5sum | cut -d ' ' -f1; 
done < file
29ece26ce4633b6e9480255db194cc40
120148eca0891d0fc645413d0f26b66b
cafc48d392a004f75b669f9d1d7bf894
7b4367e8f58835c0827dd6a2f61b7258
7b4367e8f58835c0827dd6a2f61b7258
49b12d1f3305ab93b33b330e8b1d3165
cafc48d392a004f75b669f9d1d7bf894
bee44c89ac9d4e8e4e1f1c5c63088c71
f07262ac8f53755232c5abbf062364d0
2ac7c22170c00a3527eb99a2bfde2c2c

答案 2 :(得分:0)

我会GUESS,但不能告诉你因为你没有测试它的返回代码,因为你的getline在第7行失败了所以{ {1}}具有与上一行相同的值。 md5的使用充满警告,不适合初学者使用,请参阅http://awk.info/?tip/getline

你为了这个而使用awk有什么价值,而不是只留在shell中?

答案 3 :(得分:0)

所有引用都有点尴尬 - 我不确定为什么不诚实。但是这里的东西使用较少的awk并且运行得很好:

< tmp | while read num ; do echo -n $num | md5sum | cut -f1 -d' '; done | cat -n