3

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

CNNCC
NCNCN
NNNCC
CCNNN
CCCCN

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

CNNCC
CCCCN

つまり、が3回以上発生した場合N、その行は除外され、それ以外の場合は保持されます。(私の仕事では、500 Nを超える100000行を除外する必要があるため、パフォーマンスが重要になる可能性があります)

awkで連続してフィルタリングする方法は知っていますが、連続Nしていないものを計算する方法がわかりません。

誰かがこれについてアイデアを持っていますか?のソリューションshell もOKです。

すべての答えの中で、私はこれが最も単純かもしれないと思います:

awk -FN 'NF<=3'
4

7 に答える 7

5
awk -FN -vcount=3 'NF<=count'

または、オプションをawkサポートしていない古い場合は、-v

awk -FN 'NF<=count' count=3

このコマンドは、ターゲット文字をフィールド区切り文字として使用し、最大許容オカレンスをとして使用しcountます。結果のフィールド数を比較することによりcount、基準を満たす行を選択的に印刷できます。

ステートメントの意図はすぐには明らかではないため、読みにくくなります。ただし、charとcountパラメータを設定できるという利点があるため、さまざまな設定で簡単に再利用できます。

確かに、これは多数のに対してはあまり効率的ではありませんcount。このパフォーマンスの問題を克服するためにフィールドの最大数を設定するcount+1と、残念ながら、この-mfオプションはgawkによって無視されます。

于 2012-10-31T11:11:49.803 に答える
4

これはあなたのために働くかもしれません(GNU sed):

sed -r '/(.*N){3}/d' file

また

sed 's/N/&/3;T;d' file
于 2012-10-31T12:22:38.443 に答える
2

同じ正規表現を使用したsedソリューション:

% sed '/N.*N.*N/d'

dどこかに3文字以上あるすべての行を削除しNます。

例:

% sed '/N.*N.*N/d' <<EOF
`heredoc> CNNCC
`heredoc> NCNCN
`heredoc> NNNCC
`heredoc> CCNNN
`heredoc> CCCCN
`heredoc> EOF
CNNCC
CCCCN
于 2012-10-31T11:11:11.820 に答える
2

gsubカウントに使用できます:

awk 'gsub(/N/,"N") < 3' file.txt

結果:

CNNCC
CCCCN
于 2012-10-31T11:15:15.063 に答える
2

好きじゃないgrep

count=3
egrep -v "(.*N){$count}" file

より詳しい情報:

-v一致を反転するため、3つのNを含まない行が検索されます(行に3つ以上のNがある場合は、3つのNが含まれます)。

egrepgrep -Eは、拡張正規表現(ERE)を使用するのと同等であり、ここで使用されるため、エスケープする必要は( )あり{ }ません。

于 2012-10-31T15:06:17.237 に答える
1

Perlワンライナー

perl -ne 'print if tr/N/N/ < 3'
于 2012-10-31T14:11:12.533 に答える
0

これはそれを行います:

gawk '/N.*N.*N/ { next; } { print; }'
于 2012-10-31T10:57:44.680 に答える