シェルスクリプトを書くときに私がすることのほとんどは、Python、Matlabなどの他のモジュールからI / Oをラップすることです。この目的のために、私は通常、入力/出力パスを持つテキストファイルまたは同様の性質のファイルを使用します。私は利用可能なファイルから1行を読む方法を知っています。
for file in $(cat $1);
do
code using $file
done
しかし、両方のファイルの同じ行を使用して作業を実行するにはどうすればよいですか? Javaに似ています。
while((line1 = file1.readLine()) != null) {
line2 = file2.readLine();
//do something with both lines...
}
Bashでこれを行う標準的な方法は何ですか?
ベストアンサー1
exec 3<file1
exec 4<file2
while read line1 <&3 && read line2 <&4
do
echo "line1=$line1 and line2=$line2"
done
exec 3<&-
exec 4<&-
議論する
上記では、入力行から先行スペースと末尾スペースを削除しました。このスペースを維持するには、
read …
次のように置き換えます。IFS= read …
上記では、入力のバックスラッシュはエスケープ文字として解釈されます。これをしたくない場合は、次のよう
read …
に交換してください。read -r …
read line1 <&3
line1
ファイル記述子 3 から読み込みます。これは次のように等しく書くこともできますread -u3 line1
。このような声明には
for file in $(cat $1);
知っておくべきいくつかの問題があります。シェルはファイルの内容にトークン化されたパス名拡張を適用するため、予期しない限りさまざまなエラーが発生する可能性があります。
選ぶ
while read line1 <&3 && read line2 <&4
do
echo "line1=$line1 and line2=$line2"
done 3<file1 4<file2