linux:テキストに5文字しか含まれていない姓を探します。

linux:テキストに5文字しか含まれていない姓を探します。

名前、姓、電話番号。以下はテキストです。

Hace, Apoio, 703-2101 
Yoliot, Apostolos, 4222-1124
 Jenny,Thano,105-4122 
 Heriom,Koun, 510-4122 
 Dekon, Atolo, 502-2522 
 Feow, R,685-3431

5文字のすべての姓を見つけたいです。

編集する:頑張った

egrep -i '[^:]+[a-z]5$' file2 

しかし、これはうまくいきません

答え1

awk -F '[[:blank:]]*,[[:blank:]]*' 'length($2) == 5'

オプションで、スペースで囲むようにフィールド区切り記号を設定,し、2番目のフィールドの長さは5行のレポート行です。

そしてgrep

grep -E '^[^,]*,[[:blank:]]*[^[:blank:],][^,]{3}[^[:blank:],][[:blank:]]*(,|$)'

しかし注意すべき点[^,][^[:blank:],]要素の構成、ロケールによって必ずしも単一文字である必要はありません。たとえば、GNUシステムのチェコ語ロケールでは、次のように一致します。

Stéphane,Chazel,555-5555

Chそこに仕上げ要素があるからです。したがって、これら2つのカンマ()<Ch><a><z><e><l>の間に5つの照合順序要素を見つけます。

GNUを使用すると、角括弧式が文字のみに一致するPCREの代わりにgrepこのオプションを使用できます。-P-E

有効な文字を形成しないバイト列と一致しません。ファイルに書き込まれた文字が現在のロケールの文字セットと異なる文字セットである場合、問題が発生する可能性があります。たとえば、一致しません。

Stéphane,ABCDE,555-5555

現在のロケールは文字セットとしてUTF-8を使用していますが、éiso-8859-1文字セット(0xe9バイト)で書かれている場合はé一致しません[^,](無効なバイトシーケンスなので、以外の要素を照合します。,)。

さらに、UTF-8ロケールでは、一部の文字が複数の文字で表示されることがあります。たとえば、é上記の内容は、U + 00E9文字またはU + 0065文字(e)の後にU + 0301(アクセントの組み合わせ)で表示できます。

文字/グリフを一致させるには、-Pand\X演算子を使用して文字クラスタを一致させることができます。

grep -P '^[^,]*,\h*(?![\h,])\X((?!,)\X){3}(?![\h,])\X\h*(,|$)'

答え2

\sタグと\Sタグで "egrep"を使用してください。

egrep '^[^,]*,\s*\S{5},' file
  • 最初のカンマを含む最初のフィールドをスキップし、
  • 最初のカンマの後のスペースをスキップして、
  • その後、5つの文字と一致し、その後にオプションのスペースとカンマが続きます。

答え3

次の3つのツールを組み合わせることができます。

cut -d "," -f2 file | tr -d " " | grep -E "^.{5}$"

関連情報