単純なループがあるとしましょう
while read line
do
printf "${line#*//}\n"
done < text.txt
現在のイテレーションを出力で印刷するエレガントな方法はありますか?何かのようなもの
0 The 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 Shellでも機能します。
変数の増分を本当に避けたい場合は、grepまたはawkを介して出力をパイプすることができます。
cat test.txt | while read line; do
printf " %s\n" "${line#*//}"
done | grep -n .
または
awk '{sub(/.*\/\//, ""); print NR,$0}' test.txt
範囲には、配列、文字列、入力行、またはリストを使用できます。
この例では、数字のリストを使用します。[0..10]も2の増分で使用されます。
#!/bin/bash
for i in {0..10..2}; do
echo " $i times"
done
出力は次のとおりです。
0 times
2 times
4 times
6 times
8 times
10 times
ループ範囲に関係なくインデックスを出力するには、変数「COUNTER = 0」を使用して、各反復「COUNTER + 1」でそれを増やす必要があります。
私のソリューションは各反復を出力し、FORは入力行をトラバースし、反復ごとに1つずつ増分し、入力行の各単語も表示します。
#!/bin/bash
COUNTER=0
line="this is a sample input line"
for Word in $line; do
echo "This i a Word number $COUNTER: $Word"
COUNTER=$((COUNTER+1))
done
出力は次のとおりです。
This i a Word number 0: this
This i a Word number 1: is
This i a Word number 2: a
This i a Word number 3: sample
This i a Word number 4: input
This i a Word number 5: line
ループの詳細を確認するには、次のようにします。 ここにリンクの説明を入力
スクリプトをテストするには: ここにリンクの説明を入力
更新:ここに投稿された他の回答、特に@Grahamと@DennisWilliamsonの回答の方が優れています。
これに非常に似たものが適しています:
tr -s ' ' '\n' <test.txt | nl -ba
-v0
フラグをnl
コマンドに追加し、0からインデックスを作成する場合。