Использование awk для подсчета имен в столбце - PullRequest
0 голосов
/ 25 марта 2020

Указывает инициалы людей, которые имеют три собственных имени;

, поэтому у меня есть столбец, в этом случае это

awk -F ';' '{print $1, $2}' users.txt

output:
   xxx  JoaoPedroVilar
   xxa  JoaoMiguel
   RMF  RitaPereira
   ....

Мой вопрос: мне нужно с функцией count (я угадайте), поэтому посчитайте только в столбце $ 2, имена которого имеют более 2 имен ... потому что я просто хочу в выходных сокращениях и именах с двумя плюс буквами в верхнем регистре, например:

xxx JoaoPedroVilar
RAT RicardoAntonioPereira

Пример данных:

awk -F ';' '{print $1, $2}' users.txt 

Output:
xxx NunoAndr�Ferreira
xxx HugoFernandes
xxx HugoGomes
xxx In�sSilva
xxx Jo�oTeixeira
xxx JoaquimGon�alves
JAR JoaquimRibeiro
xxx Jos�PedroRafael
xxx Jos�Soares
xxx LuisFernandes
xxx MiguelMadeira
xxx NunoAndr�Ferreira
xxx PedroLucasFarinha

ответ таков:

awk -F';' -b '$2~/[A-Z]{1}.*[A-Z]{1}.*[A-Z]{1}.*/{print $1, $2}' users.txt

Итак -b, это всего лишь awk для интерпретации всех символов

Ответы [ 4 ]

0 голосов
/ 25 марта 2020

другой подход подсчета символов верхнего регистра

$ awk -F';' 'gsub(/[A-Z]/,"&",$2)>2 {print $1,$2}'
0 голосов
/ 25 марта 2020

с:

 awk -F";" '$2~/[A-Z]{1}.*[A-Z].*[A-Z].*/' users.txt

Output: 
PLF PedroLucasFarinha

но когда я печатаю только имена, у меня есть пример:

awk -F ';' '{print $1, $2}' users.txt 

Output:
xxx NunoAndr�Ferreira
xxx HugoFernandes
xxx HugoGomes
xxx In�sSilva
xxx Jo�oTeixeira
xxx JoaquimGon�alves
JAR JoaquimRibeiro
xxx Jos�PedroRafael
xxx Jos�Soares
xxx LuisFernandes
xxx MiguelMadeira
xxx NunoAndr�Ferreira
xxx PedroLucasFarinha

, но с:

awk -F';' -b '$2~/[A-Z]{1}.*[A-Z]{1}.*[A-Z]{1}.*/{print $1, $2}' users.txt

вывод это

ххх ХосеПедроРафаэль

ххх НуноАндрФеррейра

ххх ПедроЛукасФаринья

0 голосов
/ 25 марта 2020

Без тестируемого ввода / вывода это предположение, но это звучит так, как будто вам нужно:

awk -F';' '$2 ~ /([[:upper:]][^[:upper:]]+){2}[[:upper:]]/{print $1, $2}' file

например, используя вывод, который вы разместили в другом месте для создания образца ввода:

$ cat file
xxx;NunoAndr�Ferreira
xxx;HugoFernandes
xxx;HugoGomes
xxx;In�sSilva
xxx;Jo�oTeixeira
xxx;JoaquimGon�alves
JAR;JoaquimRibeiro
xxx;Jos�PedroRafael
xxx;Jos�Soares
xxx;LuisFernandes
xxx;MiguelMadeira
xxx;NunoAndr�Ferreira
xxx;PedroLucasFarinha

.

$ awk -F';' '$2 ~ /([[:upper:]][^[:upper:]]+){2}[[:upper:]]/{print $1, $2}' file
xxx NunoAndr�Ferreira
xxx Jos�PedroRafael
xxx NunoAndr�Ferreira
xxx PedroLucasFarinha

Если это не сработает, попробуйте сначала установить для вашего языка значение C (а затем попробуйте установить его так, чтобы локальный код понимал "символы управления" в ваших файлах как буквы) Возможно, у вас просто проблема с локалью:

LC_ALL=C awk -F';' '$2 ~ /([[:upper:]][^[:upper:]]+){2}[[:upper:]]/{print $1, $2}' file
0 голосов
/ 25 марта 2020

Это регулярное выражение, вероятно, может быть реорганизовано, но оно делает свое дело (я думаю)

 awk -F';' '$2~/[A-Z]{1}.*[A-Z]{1}.*[A-Z]{1}.*/{print $1, $2}' users.txt

Это просто соответствует 3 одиночным заглавным буквам во втором столбце. Обратите внимание, что это может иметь ложные срабатывания, если у вас есть имена, такие как ScottMcMasters или BobO'Neal, но попытка разделить имена, которые еще не разделены, никогда не бывает 100%.

Пример:

  cat users.txt
xxx;JoaoPedroVilar
xxx;PedroAndrePereira
RAT;RicardoAntonioPereira
xxx;BobBob
xxx;SomeName
  awk -F";" '$2~/[A-Z]{1}.*[A-Z].*[A-Z].*/' users.txt
xxx;JoaoPedroVilar
xxx;PedroAndrePereira
RAT;RicardoAntonioPereira
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...