2

次のような文字列を除外できるフィルターを作成する必要があります。

  • 3文字未満
  • 数字または記号を含む (つまり、ラテン アルファベットの項目ではないもの)

例: 入力ファイル:

5-hydroxy-3-methylglutaryl-coenzyme_a_reductase
5-hydroxytryptamine
a
a
a
aa
abaca
abo_antibodies
abradant
abrasive

出力ファイル:

abaca
abradant
abrasive

私はgrepオプションを見てきました:

grep -v [itemtoremove] [inputfile] > [outputfile]

これはトリックを行うようです。ただし、各項目を個別に削除するだけなので、ファイルから必要なものをすべて削除するには、このスクリプトを継続的に実行する必要があります。

1つのgrep(または他のより効率的なコマンドライン)で必要なものすべてをフィルタリングできるように、誰かが解決策を持っていますか?

更新された質問

以下に、問題を解決する優れたソリューションがいくつかあります。

ただし、4つのタブ区切りの列を持つ入力ファイルにも同じことを適用したいと思います。

私は次の変更を試みました:

grep '^[a-z][a-z][a-z][a-z]-n$' input

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

a-n such_as-handheld-n  6.4623  A
abaca-n such_as-head-n  2.5586  A
abo_antibodies-n    such_as-headphone-n 8.0794  A
abrasive-n  such_as-healthcare-n    5.2845  A
function-n  such_as-hearing-n   9.5367  A

次の出力が必要です。

abaca-n such_as-head-n  2.5586  A
abrasive-n  such_as-healthcare-n    5.2845  A
function-n  such_as-hearing-n   9.5367  A

変更された grep のどこが間違っているかを誰かに教えてもらえますか? 空のファイルが出力されます。ありがとう!

4

3 に答える 3

3

質問の最初の部分については、以下はほとんどすべての grep で機能するはずです。

grep '^[a-z][a-z][a-z][a-z]*$' infile

「アップグレードされた質問」の場合、次は指定された入力から指定された出力を生成します(ブラウザに表示される空白についていくつかの仮定を行います)。

grep '^[a-z-][a-z-][a-z-][a-z-]*-n  [a-z_-]*-n  [0-9]\.[0-9]*   [A-Z]$' infile

この正規表現には、タブである 2 つの空白文字が含まれています。

指定された入力には出力に必要なハイフンとアンダースコアが含まれているため、上記ではハイフンとアンダースコアを処理するための簡単な方法を採用しています。3 番目と 4 番目の列をどのように処理するかについて、いくつか推測しました。

次の興味深い偶然の一致です。

  • 必要なすべての行の最初の列項目が「-n」xcompile で終わる
  • 「 such_as- 」で始まる 2 列目の項目も同様
  • アンダースコアまたはハイフンが指定されているのはこれらの場所だけです

したがって、式を次のようにしたい場合があります。

grep '^[a-z][a-z][a-z][a-z]*-n  such_as-[a-z]*  [0-9]\.[0-9]*   [A-Z]$' input

そして今、私は他の偶然にも気付きました。たとえば、「that_as-」に続く単語の先頭に「hea」が繰り返されていることです。しかし、おそらくこれで十分ですか?

于 2013-10-15T08:05:52.470 に答える
2

これは機能します:

egrep  -v "[^a-zA-Z]" infile | egrep "[a-zA-Z]{3,}" > outfile
于 2013-10-15T08:06:50.033 に答える
1

perl正規表現のフレーバーを使用し、[[:alpha:]]グループの文字を使用して、一致を行頭と行末に固定^でき$ます。

grep -P '^[[:alpha:]]{3,}$' infile

次の結果が得られます。

abaca
abradant
abrasive
于 2013-10-15T08:03:19.453 に答える