テキストファイルからタプルまたは名前のリストを反復処理する

テキストファイルからタプルまたは名前のリストを反復処理する

Linux スクリプトに次のコマンドがあります。

#!/bin/bash

for i in "001 ARG1" "002 ARG2" "003 ARG3"
do
    set -- $i
    echo $1
    echo $2
done

001とARG1は基本的にタプルであり、

これらのタプルをテキストファイルに移動して、代わりにforloopにロードする方法はありますか? 非常に多いので、次のようにテキストファイルを保存します

ARG1
ARG2
ARG3

または

001 ARG1
002 ARG2
003 ARG3

そして脚本は

for i in textfile.txt
do
    set -- $i
    echo $1
    echo $2
done

同じ結果が得られますか?

また、001 002 が自動的にカウントされるようにする方法はありますか? Python で counter = 0 と counter+=1 を設定し、変数を割り当てる方法のように。

答え1

入力ファイルの 2 番目の例のように、ファイルの各行にスペースまたはタブで区切られた 2 つの単語があるとします。

while read -r word1 word2; do
    echo "$word1"
    echo "$word2"
done <textfile.txt

これにより、各行の最初の単語が に読み込まれ$word1、行の残りが に読み込まれます$word2

の入力は複合コマンドreadの入力によって与えられwhile、リダイレクトを介してファイルから取得されます。

入力にその文字が発生した場合に、特別な方法で解釈しないようにするオプション-rです。read\

1 行に 1 つの単語とカウンターがある場合:

counter=0
while read -r word; do
    counter=$(( counter + 1 ))
    echo "$counter"
    echo "$word"
done <textfile.txt

これにより、各反復( から読み取られる各行textfile.txt)ごとにカウンターが 1 ずつ増加します。

printfゼロで埋められた 3 桁のカウンターを取得するには、次の書式設定文字列を使用してカウンターを出力します%.3d\n

printf '%.3d\n' "$counter"

... 代わりにecho "$counter"

の意味については%.3d\n、C ライブラリ関数 ( ) のドキュメントを参照してください。シェルの同等の機能ではprintfman 3 printf主に同じ書式文字列が使用されます。

関連情報