数字で構成される 2 つのファイルがあります。最初のファイルの行を2番目のファイルのすべての行に一致させ、一致するものが見つかったらカウンタを増やそうとします。このためにbashスクリプトをどのように書くことができますか?
file1:
1
2
3
4
5
6
file2:
2
3
6
10
12
13
23
counter = 3
答え1
次の数値セットがあるとしますfile1.txt
。file2.txt
file1.txt
:
1
2
4
6
7
file2.txt
:
2
6
7
8
9
データで実行したい操作やプロセスから収集したい項目に応じて試す方法はいくつかあります。
Grepはファイルからパターン文字列を取得できます。このフラグを使用すると、別のファイルを使用してスキーマを提供できます
-f
。さらに、この-x
フラグは完全な行一致のみを見つけることを保証するので、パターン「2」は「24」と一致しません。最後に、-c
フラグは一致の数を計算します。それらを組み合わせると、次のようになります。grep -x -c -f file1.txt file2.txt
合計を求める過程で数値に対して他の操作を実行するには、より受動的なアプローチを使用できます。
counter=0 while read number; do grep -q -x "$number" file2.txt && let counter=$counter+1 done < file1.txt echo $counter
file1.txt の各行ごとに file2.txt を再度読み取る方がはるかに効率的ではありませんが、数値で他の操作を実行したり、途中でファイルを操作したい場合は、このようなループにパッチを適用する方が簡単です。この
-q
フラグは使用されないため、grepは自動的に終了コードのみを返します。このコードを使用すると、一致が見つかったかどうかを確認でき、一致が見つかった場合にのみカウンタをインクリメントできます。
どちらを選択しても、一部の行が他の数字の部分文字列である数字の一部と一致する可能性を考慮する必要があります。また、行ごとに複数の一致がある場合はどうなるかを検討する必要があります。繰り返すたびにカウンターが増加しますか、それとも一度だけ発生しますか?上記の2つのオプションはこれを異なる方法で扱うことに注意してください!一部のデータセットでは、異なる結果が得られます。同じ結果を得るには、2つの技術を使用できます。たとえば、最初の項目はすべての重複項目が削除されたファイルのバージョンを確認できるため、複数回一致するものはありません。
grep -x -c -f <(sort -u file1.txt) <(sort -u file2.txt)