テキストファイルから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回以上)、とにかく時間がかかります。