Grepはループでパターンを繰り返します。

Grepはループでパターンを繰り返します。

2つのファイルがあります。

ファイル1:

ABA
FFR
HHI
HAB

ファイル2:

ABAABAABAABAABAABAABAABAABATRCFUJIKHRTHVFHJJHVHJJKKHGCC
FFRFFRFFRFFRFFRFFRFFRFFRFFRFFRFFRFFRFFRFHJKGHKKBVDTHJNJ
HHIHHIHHIHHIHHIDEDRJFKOLGCUOUUKJGLNJKKKKJKJKJGGHHBCFDII
HABHABHABHABHABHABHABHABGTHFOOLLLHHHUUJCIICXXTKCIABAGGC

file1 の各行は、file2 の対応する行の先頭で繰り返されるパターンです。 file1で繰り返されるパターンではなく、file2の各行部分を取得したいと思います。

希望の出力:

TRCFUJIKHRTHVFHJJHVHJJKKHGCC
FHJKGHKKBVDTHJNJ
DEDRJFKOLGCUOUUKJGLNJKKKKJKJKJGGHHBCFDII
GTHFOOLLLHHHUUJCIICXXTKCIABAGGC

私はこのループを使用しようとしています:

while read -r line
do

grep -v "$line{1,}"   file2.txt 

done < file1.txt

しかし、私は次のような結果を得ます。

ABAABAABAABAABAABAABAABAABATRCFUJIKHRTHVFHJJHVHJJKKHGCC
FFRFFRFFRFFRFFRFFRFFRFFRFFRFFRFFRFFRFFRFHJKGHKKBVDTHJNJ
HHIHHIHHIHHIHHIDEDRJFKOLGCUOUUKJGLNJKKKKJKJKJGGHHBCFDII
HABHABHABHABHABHABHABHABGTHFOOLLLHHHUUJCIICXXTKCIABAGGC
ABAABAABAABAABAABAABAABAABATRCFUJIKHRTHVFHJJHVHJJKKHGCC
FFRFFRFFRFFRFFRFFRFFRFFRFFRFFRFFRFFRFFRFHJKGHKKBVDTHJNJ
HHIHHIHHIHHIHHIDEDRJFKOLGCUOUUKJGLNJKKKKJKJKJGGHHBCFDII
HABHABHABHABHABHABHABHABGTHFOOLLLHHHUUJCIICXXTKCIABAGGC
ABAABAABAABAABAABAABAABAABATRCFUJIKHRTHVFHJJHVHJJKKHGCC
FFRFFRFFRFFRFFRFFRFFRFFRFFRFFRFFRFFRFFRFHJKGHKKBVDTHJNJ
HHIHHIHHIHHIHHIDEDRJFKOLGCUOUUKJGLNJKKKKJKJKJGGHHBCFDII
HABHABHABHABHABHABHABHABGTHFOOLLLHHHUUJCIICXXTKCIABAGGC

ベストアンサー1

ABA変数にegを使用すると、grep -v "$line{1,}"grepにパターンが与えられます。つまり、1つ、1つ、および少なくとも1つをABA{1,}探します。最後の反復は重要ではありません。それ以降は何もないので、1回の繰り返しでもマッチします。ABAABA

さて、デフォルトでは、grepは、次のように計算された反復をバックスラッシュで書く必要がある基本正規表現(BRE)を使用することを除いてください。拡張正規表現 (ERE) では 1 回以上の反復が発生しますが、BRE ではリテラル文字 4 つ (一般文字でもあります) です。\{n,m\}{1,}++

ただし、grepは内容全体を印刷します。ワイヤー一致または-v一致しません。行の一部を削除しません。 (grep -o一致する部分だけを印刷する場合を除いては適用されないと思います-v。)また、そのループを通して次grepのようになります。みんなパターンごとに行があるので、file2コンテンツは何度も繰り返されます。


各反復の各入力から1行を読み取るループが必要です。シェルで実行できますが、非常に遅いです。 AWKのような方が良いです。たとえば、次のようになります。

$ awk '{getline pat < "file1"; sub("^(" pat ")*", ""); print}' file2
TRCFUJIKHRTHVFHJJHVHJJKKHGCC
FHJKGHKKBVDTHJNJ
DEDRJFKOLGCUOUUKJGLNJKKKKJKJKJGGHHBCFDII
GTHFOOLLLHHHUUJCIICXXTKCIABAGGC

AWKプログラムは、行(およびコマンドラインで提供されている他のファイル)を通して暗黙的に繰り返されます。ここではfile2、各反復で明示的に1行を読みます。file1次に、現在の行に一致する"^(" pat ")*"同様のパターンを構成し、それを空の文字列に置き換えます。^(ABA)*

これにより、行からパターンの追加インスタンスが削除されず、たとえばにABAABAFOOABABARなりますFOOABABAR。その項目も削除するにはに変更しますgsub("(" pat ")*", "");

おすすめ記事