我正在使用Linux bash版本4.1.2
我有一个制表符分隔的input_file有5个字段,我想计算每行的MD5,并将md5sum放在每行的末尾。
因此,期望的output_file应该每行有6个字段。
这是我的编码:
cat input_file | while read ONELINE
do
THEMD5=`echo "$ONELINE" | md5sum | awk '{print $1}'`
echo -e "${ONELINE}\t${THEMD5}"
done > output_file
编码在大多数情况下运作良好。
但是,如果ONELINE以单/双标签结束,则尾随标签将消失!
因此,由于缺少选项卡,output_file有时会包含4或5个字段的行。
我尝试在IFS=
声明中添加IFS=''
或IFS=$'\n'
或IFS-$'\012'
或while
,但仍然无法解决问题。
请帮忙。
Alvin SIU
答案 0 :(得分:2)
如果您希望md5sums中包含尾随换行符(正如您的原始代码所示),以下内容肯定是正确的:
while IFS= read -r line; do
read sum _ < <(printf '%s\n' "$line" | md5sum -)
printf '%s\t%s\n' "$line" "$sum"
done <input_file
注意:
read
剥离;设置IFS=
足以防止这种影响。-r
参数,read
也会解释反斜杠文字,剥离它们。echo -e
是危险的:它解释行内的转义序列,而不是将它们作为文字发出。echo
是不好的形式。请参阅the relevant POSIX spec,特别是“应用程序使用和RATIONALE”部分。'%q\t%s\n'
代替'%s\t%s\n'
作为格式字符串。