web-dev-qa-db-ja.com

"for"ループを使用して、各行を入力と見なして、ファイルを行ごとに連続的に読み取ります

以下の値を持つfile.txtファイルを検討してください

one,two
three,four
five,six
six,seven
red,tree

以下のアクティビティを実行するには、シェルスクリプトコマンドが必要です

  1. ループが連続して実行されるループの場合、file.txtの行数と同じ数のループ
  2. 各ループ実行では、それぞれの行を実行の入力と見なす必要があります。

たとえば、最初のループの実行では、「1」を変数に格納し、「2」を別の変数に格納して、実行時に変数値を使用する必要があります。

Input1="one"
Input2="two"

2行目の実行と同様に、「3」は変数に格納し、「4」は以下のような別の変数に格納する必要があります

Input1="three"
Input2="four"
1
user8554534
while IFS=, read -r input1 input2; do
    # do stuff with "$input1" and "$input2"
done <file.txt

IFSreadコマンドのコンマに設定すると、各入力行がコンマで分割されます。行の2つのフィールドがinput1input2に読み込まれます。

1行に2つ以上のフィールドがある場合、「残った」データはinput2に入れられます。

データをどのように処理するかによって、これはまったく良いアイデアかもしれませんし、そうでないかもしれません。参照 なぜシェルループを使用して、テキストを処理することが悪い習慣と見なされているのですか?

awkは、ループを必要とせずに、このようなデータを解析する場合に特に便利です。

$ awk -F, '{ printf("Line %d:\n\tField 1 = %s\n\tField 2 = %s\n", NR, $1, $2) }' file.txt
Line 1:
        Field 1 = one
        Field 2 = two
Line 2:
        Field 1 = three
        Field 2 = four
Line 3:
        Field 1 = five
        Field 2 = six
Line 4:
        Field 1 = six
        Field 2 = seven
Line 5:
        Field 1 = red
        Field 2 = tree
4
Kusalananda

あなたが何を求めているのかは不明です。なぜ各反復でファイル全体が必要なのですか。

これが必要ですか?

while IFS=, read -r Input1 Input2; do
    # do something with the variables
    echo "1=$Input1  2=$Input2"
done < file.txt
3
glenn jackman