bashスクリプトで同時に2つのファイルから読み取る方法はありますか? プログラミング言語の例での & の使用法に似たもの:
for i in $(cat filea.txt) & for j in $(cat fileb.txt)
do
if "$j" = "$i"
then echo "$i"
fi
done
意味: filea の 1 行目は fileb の 1 行目と比較し、filea の 2 行目は fileb の 2 行目と比較します。
bashスクリプトで同時に2つのファイルから読み取る方法はありますか? プログラミング言語の例での & の使用法に似たもの:
for i in $(cat filea.txt) & for j in $(cat fileb.txt)
do
if "$j" = "$i"
then echo "$i"
fi
done
意味: filea の 1 行目は fileb の 1 行目と比較し、filea の 2 行目は fileb の 2 行目と比較します。
単語ではなく行を比較するためにできることは、少しゆがんでいますが、次のようになります。
while read -r -u 3 line1 && read -r -u 4 line2
do
if [ "$line1" = "$line2" ]
then echo "$line2"
fi
done 3<filea.txt 4<fileb.txt
私は明示的に対称性のためにファイル記述子 3 と 4 を使用しました (Polya: 「対称であるものを対称的に扱い、自然な対称性を乱暴に破壊しないでください」)。
while read -r line1 && read -r -u 3 line2
do
if [ "$line1" = "$line2" ]
then echo "$line2"
fi
done <filea.txt 3<fileb.txt
read -u は何の略で、3 と 4 は何の略ですか?
ファイン マニュアルを読んでください。bash
マニュアルはオンラインで入手できます。まだブックマークを付けていない場合は、今すぐブックマークを付けてください。
この-u
fd
オプションは、標準入力 (もちろんファイル記述子 0) からではなく、指定されたファイル記述子 (サンプル コードでは 3 または 4) から読み取ることを意味します。3 と 4 は、読み取るファイル記述子を表します。このコードは、ループ中にファイル記述子 3filea.txt
とファイル記述子 4 をリダイレクトします。ファイル記述子 3 を読み取るプロセスは、 からデータを取得します。同上 4. スクリプトは、1 つのコマンドに 3 から読み取り、もう 1 つのコマンドに 4 から読み取り、行を読み取るように指示します。したがって、最終的な効果は、との両方から利用可能なデータがある間、ループが実行され、2 つの行を比較して出力することです。fileb.txt
while
filea.txt
read
read
filea.txt
fileb.txt
目的が 2 つのファイル間で共通する行を印刷することである場合は、comm
コマンドを使用する方がはるかに優れています —そのための良い方法については、Jonas Elfströmの回答を参照してください。
あなたの目的が2つのファイルから行を並行して読み取ることであると仮定すると、bash
. 2 つのファイルから単語を並行して取得する必要がある場合(これはfor i in $(<filea.txt)
表記法で示されます)、おそらくI/O リダイレクションと組み合わせてプロセス置換を使用する必要があります。
while read -r -u 3 word1 && read -r -u 4 word2
do
if [ "$word1" = "$word2" ]
then echo "$word2"
fi
done 3< <(printf "%s\n" $(<filea.txt)) 4< <(printf "%s\n" $(<fileb.txt))
これを実現する方法は他にもあります。特に、tr
代わりに を使用するprintf
と、ファイルが大きい場合 (何メガバイトも大きい場合) に適しています。
目標が両方のファイルで同じ行を出力することである場合は、commを使用できます
comm -12 file1 file2
しかし、実際に 2 つのファイルをステップ実行する必要がある場合は、ファイル記述子を使用できます。
#! /bin/bash
while read -r lineF1 <&3 && read -r lineF2 <&4; do
echo "$lineF1"
echo "$lineF2"
done 3<file1 4<file2