Bash - 別のファイルにリストされている1つのファイルのIDペアを見つける

Bash - 別のファイルにリストされている1つのファイルのIDペアを見つける

IDペアを一覧表示する大容量ファイル「F1」があります。

id1 = 数値、id2 = 文字

id1 id2 id1 id2 ...

目的は、2番目のファイル「F2」から次の形式でIDペアを含む行を抽出することです。

id1 TYHYU 61728497 rtyheyia id2 8372819203948 id1 UJLJF 57383930 utkjruak id2 5683903048377 ...

これを処理するために全能の「grep」を使用しようとしましたが、いくつかの障害に直面しました。

F1の各Id1とId2はF2で何度も繰り返されるため、使用されなくなりましたgrep -Fwf F1.txt F2.txt > F3.txt。つまり、ID1+ID2 は完全な識別子を表します。

実行するとgrep -w "$id1.*$id2" db.txt問題は解決しますが、どのように到達するのかわかりません。 (おそらくwhile read -rgrepを実行する前に、F1の各行を変数セットとして扱うために厄介なループを実行した可能性があります。)

ベストアンサー1

ほぼすべて来ました。この場合、読み込みループは正常に動作するため、次のようになります。

while read -r line; do
    id1=$(echo "$line" | cut -d ' ' -f 1)
    id2=$(echo "$line" | cut -d ' ' -f 2)
    grep -w "${id1}.*${id2}" "$F2"
done < "$F1"

ただし、探しているIDがデータの他のフィールドのどこにでも存在する場合は、誤検出が返されることがあります。 F2のIDフィールドが常に1列と5列に表示されることを保証できる場合は、フィールドの位置も確認することをお勧めします。これはawk次の行を使用してすばやく実行できますgrep

awk -v id1="$id1" -v id2="$id2" '$1 == id1 && $5 == id2 {print $0}' "$F2"

これはおおよそ「F2の各行について、列1がid1で、列5がid2の場合、行全体を印刷します」と言います。

免責事項、私はこれをテストしていません。

おすすめ記事