複数行のテキスト ファイルがあります。while コマンドを使用してファイルを行単位で読み取りますが、値を別々の変数に保存し、末尾のシェル スクリプトで使用する必要があります。
のカットコマンドは読み取り行ではなくファイル全体を区切ります。
例my_file.txt
:
d1:jobid1
id2:jobid2
私は以下のwhileループを使用してファイルを行ごとに読み取ります
while IFS= read -r line; do
jobid=`cut -d: -f2`
id=`cut -d: -f1`
#remaining shell-script dependent upon variables#
done < my_file.txt
各行のジョブ ID と ID を保存しmy_file.txt
、末尾のスクリプトを実行したいと思います。各行は新しい行にあります
変数に値を再帰的に格納するための支援が必要です。行ごとに読み取り、2 つのフィールドを区切って別々に格納するより良い方法があれば教えてください。
答え1
cut
はデフォルトで標準入力から読み取ります。コマンド置換では、標準入力はループの標準入力から継承されます ( の呼び出しに他の明示的な入力を提供しないためcut
)。ループの標準入力は入力ファイルから取得されます。
その結果、ファイルの最初の行は によって読み取られread
、他のすべての行は の最初の呼び出しによって読み取られることになりますcut
。したがって、変数 の値はjobid
ジョブ ID の改行で区切られた文字列になり、id
変数 は空になります。ループは 1 回の反復のみを実行します。
あなた使用できる、 例えば、
id=$( printf '%s\n' "$line" | cut -d: -f1 )
# or: id=$( cut -d: -f1 <<<"$line" )
# (in shells that supports "here-strings")
しかし、それはよりクリーンでより効率的であるため、不必要である。
while IFS=: read -r id jobid; do
# code that uses "$id" and "$jobid" goes here
done <my_file.txt
read
これは、 が入力行からデータを一度に複数の変数に読み込むことができるという事実を利用しています。IFS
をコロンに設定すると、行はコロンで分割され、最初のフィールドが に読み込まれid
、残りは に読み込まれます。 を呼び出す必要はまったくjobid
ありません。cut