ファイルを反復処理し、行を位置パラメータとして別のファイルに送信する

ファイルを反復処理し、行を位置パラメータとして別のファイルに送信する

次の形式で日付を含むファイル (dates.txt という名前) を反復処理したいと思います。

2009 08 03 08 09
2009 08 03 09 10
2009 08 03 10 11
2009 08 03 11 12
2009 08 03 12 13
2009 08 03 13 14

そして、各行の各フィールドを位置パラメータとして別のスクリプトに渡します。

つまり、他のスクリプトは、コマンド ラインに次のコードを入力すると実行されます。

$ . the_script 2009 08 03 08 09

私が試してみましたfor i in $(./dates.txt);do echo ${i};done

しかし、次のようになります:

./dates: line 1: 2009: command not found
./dates: line 2: 2009: command not found
./dates: line 3: 2009: command not found
./dates: line 4: 2009: command not found
./dates: line 5: 2009: command not found
./dates: line 6: 2009: command not found

このことから、各行で動作しているが、各フィールドで停止している可能性があることがわかります。

上記の理由から、読み取った行を位置パラメータとして他のスクリプトに渡す方法がまだわかりません。また、どこでそれを実行すればよいのかわかりませんか? 助けてください!

答え1

おそらく、このようなことを意味しているのでしょうか?

while read -d $'\n' i; do echo $i;done <./dates

while read -d $'\n' i; do . the_script $i;done <./dates

答え2

調達(.)が必要ない場合、これはxargs:

xargs -a dates.txt -rL1 the_script
  • xargs入力行を読み取り、指定されたコマンドの引数として使用します。デフォルトの行区切り文字は改行です。
  • 他のコマンドからデータをパイプしたり、 を使用して入力ファイルを指定したりできます-a
  • スクリプトの呼び出しごとに正確に 1 行が使用されるため、-r(行が空の場合は実行しない) オプションと-L(呼び出しごとに最大 N 行を使用する) オプションを指定します。

答え3

コマンドで を使用しcat、スクリプトが同じディレクトリにない場合はファイル名への正しいパスを使用していることを確認してください。リストが同じ場合は をdates.txt使用します$(cat ./dates.txt)ここでタイプミスを編集しました。.txt を含めてください。

次に例を示します。

という名前の日付のリストdates.txt

2009 08 03 08 09
2009 08 03 09 10
2009 08 03 10 11
2009 08 03 11 12
2009 08 03 12 13
2009 08 03 13 14

lstdates.shそのリスト内の惑星を反映するように名付けられたスクリプト。編集済み これは、内部フィールドセパレータ(IFS)のサブシェルで実行されます。1サブシェルの外側では変更されない2

#!/bin/bash
# Listing each date as an argument for `the_script`.

# Parenthesis runs in a subshell    
( 
  # IFS line break
  IFS=$'\012'
  for dates in $(cat ./dates.txt)
  do
    echo $(./the_script $dates)
  done
)

デフォルトでは、IFS は各空白をフィールドの終わりとして認識します。IFS=$'\012'各新しい行をフィールドの終わりとして認識します。各行が のように二重引用符で囲まれている場合は"2009 08 03 08 09"、デフォルトの IFS が機能します。

the_script以下の内容のみが含まれます。

#!/bin/bash
echo $1

参照:上級 Bash スクリプトガイド 第 11 章 ループと分岐

関連情報