単純なループがあるとします
while read line
do
printf "${line#*//}\n"
done < text.txt
出力で現在の反復を印刷するエレガントな方法はありますか? 何かのようなもの
0 ザ・ 1クイック 2 ブラウン 3 キツネ
ループごとに変数を設定してインクリメントすることを避けたいと思っています。
単純なループがあるとします
while read line
do
printf "${line#*//}\n"
done < text.txt
出力で現在の反復を印刷するエレガントな方法はありますか? 何かのようなもの
0 ザ・ 1クイック 2 ブラウン 3 キツネ
ループごとに変数を設定してインクリメントすることを避けたいと思っています。
これを行うには、反復ごとにカウンターをインクリメントする必要があります(回避しようとしているように)。
count=0
while read -r line; do
printf '%d %s\n' "$count" "${line*//}"
(( count++ ))
done < test.txt
編集: もう少し考えた後、bash バージョン 4 以降を使用している場合は、カウンターなしで実行できます。
mapfile -t arr < test.txt
for i in "${!arr[@]}"; do
printf '%d %s' "$i" "${arr[i]}"
done
mapfile ビルトインは、ファイルの内容全体を配列に読み込みます。次に、行番号となる配列のインデックスを反復処理して、その要素にアクセスできます。
あまり見かけませんが、while
ループの条件句に複数のコマンドを含めることができます。以下でも明示的なカウンター変数が必要ですが、この配置は一部の用途に適しているか、魅力的である可能性があります。
while ((i++)); read -r line
do
echo "$i $line"
done < inputfile
このwhile
条件は、最後のコマンドが返すもの(read
この場合)によって満たされます。
do
同じ行にを含めることを好む人もいます。これは次のようになります。
while ((i++)); read -r line; do
echo "$i $line"
done < inputfile
n=0
cat test.txt | while read line; do
printf "%7s %s\n" "$n" "${line#*//}"
n=$((n+1))
done
もちろん、これは Bourne シェルでも機能します。
変数のインクリメントを本当に避けたい場合は、grep または awk を介して出力をパイプできます。
cat test.txt | while read line; do
printf " %s\n" "${line#*//}"
done | grep -n .
また
awk '{sub(/.*\/\//, ""); print NR,$0}' test.txt
更新: ここに投稿された他の回答、特に@Grahamと@DennisWilliamsonの回答の方が優れています。
このようなものが適しているはずです:
tr -s ' ' '\n' <test.txt | nl -ba
0からインデックスを作成する場合-v0
は、コマンドにフラグを追加できます。nl