0

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 行目と比較します。

4

2 に答える 2

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マニュアルはオンラインで入手できます。まだブックマークを付けていない場合は、今すぐブックマークを付けてください。

この-ufdオプションは、標準入力 (もちろんファイル記述子 0) からではなく、指定されたファイル記述子 (サンプル コードでは 3 または 4) から読み取ることを意味します。3 と 4 は、読み取るファイル記述子を表します。このコードは、ループ中にファイル記述子 3filea.txtとファイル記述子 4 をリダイレクトします。ファイル記述子 3 を読み取るプロセスは、 からデータを取得します。同上 4. スクリプトは、1 つのコマンドに 3 から読み取り、もう 1 つのコマンドに 4 から読み取り、行を読み取るように指示します。したがって、最終的な効果は、との両方から利用可能なデータがある間、ループが実行され、2 つの行を比較して出力することです。fileb.txtwhilefilea.txtreadreadfilea.txtfileb.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と、ファイルが大きい場合 (何メガバイトも大きい場合) に適しています。

于 2013-08-07T06:49:31.960 に答える
1

目標が両方のファイルで同じ行を出力することである場合は、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
于 2013-08-07T06:49:39.960 に答える