これを行う通常の方法は、\r
ある時点でキャリッジリターン(CR)を発行し、行末の\n
改行または改行(LF)を省略することです。を使用しているのでawk
、次のことを試すことができます。
awk '{printf "\r%s", $1} END {print ""}'
ほとんどの行では、キャリッジリターンとフィールド1のデータを出力します(末尾に改行はありません)。入力の最後に、空の文字列とそれに続く改行を出力します。
awk
もう1つの可能性は、スクリプトをfor
ループの外側に配置する必要があることです。
for x in `cat ${PATCHLIST}`
do
if ( showrev -p $x | grep $x > /dev/null 2>&1 ); then
touch /tmp/patchcheck/* | echo "pass" >> /tmp/patchcheck/$x
wc /tmp/patchcheck/* | tail -1
else
touch /tmp/patchcheck/* | echo "fail" >> /tmp/patchcheck/$x
wc /tmp/patchcheck/* | tail -1
fi
done | awk '{ printf "\r%s", $1} END { print "" }'
よくわかりませんが、スクリプト内の残りの繰り返しコードに同様の合理化を適用できると思います。
for x in `cat ${PATCHLIST}`
do
if showrev -p $x | grep -s $x
then echo "pass"
else echo "fail"
fi >> /tmp/patchcheck/$x
wc /tmp/patchcheck/* | tail -1
done | awk '{ printf "\r%s", $1} END { print "" }'
touch
これにより、 (あまり効果がないように見えます)が排除されます。特に、の空の出力touch
がパイプさecho
れ、標準の入力が無視される場合は排除されます。行のサブシェルを削除しif
ます。それはそれを静かに保つための-s
オプションを使用します。grep
私はまだwc
ラインについて少し疑わしいです。で識別されるファイルにパッチを2回リストしない限り、各ファイルには1行(合格または不合格)が含まれている必要があるため、実際にはファイルの数を数えようとしていると思います${PATCHLIST}
。その場合、私はおそらく以下を使用します:
for x in `cat ${PATCHLIST}`
do
if showrev -p $x | grep -s $x
then echo "pass"
else echo "fail"
fi >> /tmp/patchcheck/$x
ls /tmp/patchcheck | wc -l
done | awk '{ printf "\r%s", $1} END { print "" }'
これにより、/ tmp / patchcheck内のファイルが一覧表示され、出力された行数がカウントされます。これは、とが同じであるため$0
、awk
スクリプトで簡単に印刷できることを意味します。効率が重要である限り(それほど多くはありません)、各ファイルを開くのではなく、ディレクトリのみをスキャンするため、これはより効率的です。しかし、それはあなたがやろうとしていることのより具体的なより正確な説明です。後でパスをカウントする場合は、次を使用できます。$0
$1
ls
wc
for x in `cat ${PATCHLIST}`
do
if showrev -p $x | grep -s $x
then echo "pass"
else echo "fail"
fi >> /tmp/patchcheck/$x
grep '^pass$' /tmp/patchcheck/* | wc -l
done | awk '{ printf "\r%s", $1} END { print "" }'
もちろん、これは各ファイルの読み取りに戻りますが、現在はファイルからより洗練された情報を取得しています(これは、より洗練された情報に対するペナルティです)。