web-dev-qa-db-ja.com

バッシュループ、現在の反復を出力しますか?

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

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

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

 0 The 
 1クイック
 2ブラウン
 3フォックス

変数を設定したり、ループごとにインクリメントしたりしないようにしたいと思っています。

22
Steven Penny

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

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

32
jordanm

あまり表示されませんが、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
3
Graham

範囲には、配列、文​​字列、入力行、またはリストを使用できます。

この例では、数字のリストを使用します。[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

ループの詳細を確認するには、次のようにします。 ここにリンクの説明を入力

スクリプトをテストするには: ここにリンクの説明を入力

1
Sergio Perez

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

これに非常に似たものが適しています:

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

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

0
thb