テキストファイルから2つ以上の単語(スペースで区切られていない)を含む行を削除する方法は? [閉鎖]

テキストファイルから2つ以上の単語(スペースで区切られていない)を含む行を削除する方法は? [閉鎖]

テキストファイルから2つ以上の単語(スペースで区切られていない)を含む行を削除する方法は?

文書には、これらの単語の「シングルバージョン」もあります。

たとえば、

alpha
beta
gama
alphabeta
zeta
gamabeta

出力は次のようになります。

alpha
beta
gama
zeta

編集する:私のファイルには150万行が含まれています。

ベストアンサー1

かなり短いファイルの場合、行にERE演算子が含まれていないと仮定すると、次のようになります。

$ LC_ALL=C grep -vxE "($(paste -sd '|' file)){2,}" file
alpha
beta
gama
zeta

2つ以上の行シーケンスを含まない行を返しますfile

どのように機能するかは、grep次のコマンドを書くことです。

LC_ALL=C grep -vxE '(alpha|beta|gama|alphabeta|zeta|gamabeta){2,}' file

より大きなファイルの場合は、長さまたはパラメータ+環境(またはLinuxの単一パラメータ)制限に直面します。引数の代わりに標準入力を使用して正規表現を渡すことでこの問題を解決できますが-f -、それでも正規表現のサイズに制限があります。

perl代わりに、以下を使用してgrepより大きな入力を処理できます。

perl -le '
  chomp (@words = <>);
  $re = "^(" . join("|", map {qr{\Q$_\E}} @words) . "){2,}\\z";
  for (@words) {print unless m/$re/}' file

(これは上記の他の制限も防止します)。

各単語を他の単語と比較する必要があるため(おそらく2回以上)、とにかく時間がかかります。

おすすめ記事