32

単純なループがあるとします

while read line
do
  printf "${line#*//}\n"
done < text.txt

出力で現在の反復を印刷するエレガントな方法はありますか? 何かのようなもの

0 ザ・
1クイック
2 ブラウン
3 キツネ

ループごとに変数を設定してインクリメントすることを避けたいと思っています。

4

5 に答える 5

57

これを行うには、反復ごとにカウンターをインクリメントする必要があります(回避しようとしているように)。

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 ビルトインは、ファイルの内容全体を配列に読み込みます。次に、行番号となる配列のインデックスを反復処理して、その要素にアクセスできます。

于 2012-06-08T04:41:51.177 に答える
23

あまり見かけませんが、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
于 2012-06-08T11:22:30.857 に答える
4
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
于 2012-06-08T04:57:57.243 に答える
1

更新: ここに投稿された他の回答、特に@Grahamと@DennisWilliamsonの回答の方が優れています。

このようなものが適しているはずです:

tr -s ' ' '\n' <test.txt | nl -ba

0からインデックスを作成する場合-v0は、コマンドにフラグを追加できます。nl

于 2012-06-08T04:00:47.893 に答える