次のスクリプトがあります。
#!/usr/bin/env bash
# Script to generate MD5 hash for each line.
[ $# -eq 0 ] && { echo "Usage: $0 file"; exit 1; }
file=$1
shopt -s expand_aliases
alias calc_md5='while read -r line; do md5sum <<<$line; done'
paste <(sort "$file" | uniq | calc_md5) <(sort "$file" | uniq)
times
各行のMD5チェックサムを並べて印刷しますが、これは私に必要なものです。たとえば、
$ ./md5_lines.sh file.dat
5c2ce561e1e263695dbd267271b86fb8 - line 1
83e7cfc83e3d1f45a48d6a2d32b84d69 - line 2
0f2d633163ca585e5fc47a510e60f1ff - line 3
73bb3632fc91e9d1e1f7f0659da7ec5c - line 4
上記のスクリプトの問題は、各列/ストリームに対してファイルを2回読み取って解析する必要があることです。理想的には、すべての行をソートして一意にし、一度だけ入力として使用したいと思います。
sort
ファイルを一度だけ(&uniq
)解析し、出力を2つの異なるストリームにリダイレクトし、行を並べて表示してより大きなファイルをより迅速に処理できるように、上記のスクリプトを変換するにはどうすればよいですか。
私のもう一つの試みは次のとおりです。
tee >(calc_md5) >(cat -) \
< <(sort "$file" | uniq) \
>/dev/null
times
ただし、ストリームを個別に印刷します(並べて印刷しません)。
paste
理想的には、次のように使用したいのですが、tee
エラーが発生します。
$ paste >(cat -) >(cat -) </etc/hosts
paste: /dev/fd/63: Permission denied
ベストアンサー1
2つの項目を並べて表示するには、printfを使用してフォーマットされた印刷を実行できます。
#!/bin/bash
sort "$1" | uniq | while read line; do
md5=$(md5sum <<< "$line")
printf "%s %s\n" "$md5" "$line"
done
times