Escrevendo um script que dá quantas linhas têm “X” e “Y”?

3

Estou fazendo um curso de Linguística e gostaria de usar scripts de shell para me ajudar a fazer algumas coisas repetitivas, como contar quem faz perguntas. Aqui está parte do arquivo que abri e trabalho com o comando gedit

Antoine: Il a du

Eliahou:(Eliahou se penche) Chez Ubisoft? T'as du faire la queue?

Delmas: Non j'ai pas fait d'queue.

Eliahou: directement ils t'ont donné ça, t'es arrivé...

Antoine: //Bonjour je voudrai un lapin-crétin.

Delmas: Eu::f//, Euh un 'tit speech quand même.

Eliahou: Ha, tu leur a parlé °(quand même un peu)?

Delmas: Oui bien sûr.

Estou procurando escrever um script geral que ofereça quantas linhas têm "X" e "Y"? Estou procurando, por exemplo, como escrever um script que forneça o nome e o número de ocorrências de nomes associados a uma variável. Por exemplo, no diálogo, Eliahou faz duas perguntas.

Mais precisamente:

  • quem faz perguntas (quem tem um "?" na cotação), quanto tempo
  • quem cortou alguém, (quem tem um "//" na cotação)
  • que repete frases de alguém
  • quem faz alguma elisão ("t'es" em vez de "tu es" ("você é" em vez de "você é") e com que freqüência ...

Para o primeiro eu pensei sobre

# usage nbocc String File
grep $1 $2 >temp
wc -l <temp
rm temp

o resultado é:

MyComputer:~$ sh compteurQuestions ? Communication
8

No entanto, eu não tenho pessoas com tal ordem ... Como devo fazer para tê-las?

Eu sei que devo usar

^........

porque o comprimento máximo de um nome aqui é 8. Mas esta é uma abordagem bastante brutal, estou procurando um mais elegante

Eu tentei com o roteiro fantástico dado por Jay Jargo, ainda parece que há um problema, até depois de escrever com o texto real $ compteurQuestions -v s="?" exempleCommunication , recebo Delmas 12 0 . No entanto, Delmas fez pelo menos uma pergunta: Delmas : ils l’ont plié ?

o texto real

(Tout le monde est assis face à la caméra sauf Matthieu) Antoine: Allumlalum...Elal...

Eliahou: c'est mieux pour toi! c'est mieux pour toi!

Matthieu: Mais t'inquiè::::te!

Eliahou:* Il est allumé là?

Antoine: * Allume //Matthieu: Ca, C'est bon, ça// sinon sinon [Antoine se lève] // Matthieu:* Non mais, on s'voit tous, y a rien qui va bouger, t'inquiète assieds-toi. * Non mais //Matthieu: Mais ça va pas bouger.// non, mais au moins pour vérifier.

Eliahou: Non, non laisse le //Matthieu: Regarde on bouge pas non plus [Matthieu s'assoit]// non, non mais c'est mieux qu'on se voit. //Antoine: Si si// nan, nan

Matthieu: C'est trop perturbant //[Eliahou pointe l'écran du doigt]//

Antoine: La dernière fois qu'on, la dernière fois on l'a pas fait [Antoine touche à l'ordinateur] //Matthieu: Haaaa Nan Haaa Je vois un écran là//

Antoine: [Antoine présente un lapin-crétin] Les amis j'vous présente Bob, Bob le gri-gri.

Delmas: C'est un cadeau du Forum.

Antoine: Salut les amis, Hey!(il lève un sourcil) Tiens, on te passe le grigri, celui qui a le grigri a le droit de parler //Matthieu: Quand tu sais combien...// [Delmas prend le lapin-crétin, Matthieu suit du regard]

Eliahou: Tu l'as eu au forum, genre [il point le gri-gri du doigt]? //

Antoine: C'est lui qui a la parole. [Antoine pointe Delmas du doigt]//

Delmas: Oui chez Ubisoft.

Antoine:* Il a dû…

Eliahou: [se penche] * Chez Ubisoft? T'as du faire la queue?

Delmas: Non j'ai pas fait d'queue.

Eliahou: directement ils t'ont donné ça, t'es arrivé... //Antoine: Bonjour je voudrais un lapin-crétin.// //Delmas: Eu::f,// Euh un 'tit speech quand même.

Eliahou: Ha, tu leur a parlé quand même un peu?

Delmas: Oui bien sûr.

Eliahou: A la fin ils t'ont dit, “Non on a pas besoin de toi” et après tu leur as [il fait un geste pour ramener quelque chose vers soi] “Chpeux prendre quand même ça.” C'est ça.

Delmas: Voilà. [signe de la main gauche qui se lève et retombe]

Antoine: Bonjour Delmas apprenti lapin crétin //Delmas: Nan mais, [écarte le bras gauche et fait non de la tête] après le Forum ça sert presque à rien, ils ne veulent que des des// des longs si... Et des trucs de six mois. [acquiesce et lève les yeux]

Delmas: //Ouai, voilà.

Eliahou: Ah six mois, ah ouai? Hier chui parti [Delmas remonte ses lunettes et se gratte le nez] avec une personne qui voulait ...euh... pas faire de stage là bas, Juste ramasser des petits gadgets nan mais vraiment, yen a ya des personnes, [ Delmas lève le doigt) et tu lai...//Antoine: huhu!!! c'est vrai?//

Matthieu: r'garde Mohammed, tout à l'heure il est revenu avec du liquide vaisselle.

Antoine: HAHAHA! [se tape la cuisse] il aurait [lève le doigt] même pu passer chez Etam lu grpus au pus [doigt index]

Matthieu: J'ai J'ai même envoyé un sms à Mariam, tu pouvais même trouver à bouffer, le Printemps ils ont ramené à bouffer

Eliahou: Sérieux? (interloqué) Putain, holala //Delmas: Pffft! (tête sur le côté) Euuuuh La vérité, Hier j'y étais mais pas //pour ramasser//

Antoine: (inaudible) tu dis la vérité, Hinhinhin

Eliahou: la vérité... [écarte de temps en temps les mains] nan sérieux j'y étais hier et puis moi chui parti pour trouver un stage, 'fin pour trouver un stage, pour essayer de ramasser un peu des gadgets aussi.

Antoine: Hin Hin Hin! Vas-y, nous t'écoutons... //Eliahou: Et puis baaah, dès que t'arrives ya énormément de monde, c'est assez frustrant t'as po envie de faire la queue// toi tu veux ton p'tit gadget, ^(ton petit lapin-crétin) hin hin hin? //Eliahou: Et j'veux tout de suite mon p'tit gadget. E::::t puis euh dès que j'arrive à un moment chui arrivé jusqu'au bout du du forum e:::t yavait personne, ché plus c'était qui quelle société ils cherchaientt des stagiaires. Donc euuh, mais bon...j'me demandais

Antoine: Ca m'parait louche [pointe Eliahou du doigt], là louche

Eliahou: Ca m'paraissait louche.

Antoine: Ca m'paraissait louche [pointe le doigt vers le ciel]

Eliahou : je leur ai laissé mon cv euhhhh , ils l’ont gardé , ils l’ont plié , ils l’ont mit de coté et j’suis parti

Antoine : euh euh les cv

Delmas : ils l’ont plié ? [En faisant le geste avec les mains]

Eliahou : ouais [hoche la tête]

Delmas : ils l’ont plié [Antoine : claque des mains] rire de tous

Antoine : shiiiiiiiit [fait semblant de déchirer du papier]

Matthieu : oh ca veut tout dire [se gratte le pied et se repenche derrière] ouais c’est cool, ça c’est eh, ca c’est eh

Eliahou : mais vous y êtes tous allés [montre tout le monde du doigt], toi t’es allé, toi t’es allé ? //Delmas : oui moi j’y suis allé, j’y vais depuis euh// //Matthieu : non [en hochant la tête]// et qu’est-ce que tu attends alors ? [Matthieu : hoche les épaules]>> T’as fait ton cv au moins ?ils prenaient ton cv là-bas non, pour les gars qui………

Antoine : [croise les pieds] mais mais mais , moi j’ avais les cv pour luiiiiiiii [ en donnant des points sur ses cuisses ] non mais , il beh il marchait pour moi // Eliahou : ça c’ est vrai , il changeait juste la photo // // Matthieu : attends mais il avait son son cv // oui voilà , tu ne voudrais pas essayer ça ? [Donne un coup de coude à Matthieu].

Delmas : après les compétences euh ne sont pas les mêmes [Antoine : ballait un coup de la main comme quoi ce n’est pas grave]

Matthieu : ah beuh ouais

Antoine : ouais mais mais t’as fait des maths dans ta jeunesse ? [Hoche la tête et se tape à plusieurs reprises les cuisses] *rire de tous *

Delmas : t’as fait un peu’d C ? [Tendant la main vers Matthieu] >> T’as fait un peu’d C ?

Matthieu : ouais ouais j’ai fait un peu de C // Antoine : ouais [baisse la tête et croise les mains sur ses genoux] // [serre ses doigts]

Eliahou : t’as fini d’écrire ta lettre ? [Regardant Matthieu et lui tendant la main]// Antoine : t’as quand même euh, >> tu sais écrire une lettre [tapote Matthieu], t’as >> fait une lettre à ta maman quand même ?//

Matthieu : je déteste ça, [regarde Antoine dans les yeux], [Eliahou se mordille les ongles des doigts]*rire d’Antoine *// Delmas : voilà //

Eliahou : et sinon les stages euh vous avez trouvé

Antoine : moi je l’ai déjà

Eliahou : et toi [montre Delmas du doigt] non mais toi t’as ton stage en anglais

Antoine : c’est vrai [en souriant]

Delmas : non mais c’ est que l’ entretien , après euh c’ est pas sure qu’ ils me prennent //Antoine : ouï tu m’ avais dit euh ch’ était cro bizarre euh // si si c’ est bizarre [ se gratte le nez ] ( silence )

Eliahou : non mais c’est pas fini la ? // Delmas : Non mais c’est chaud hein // il reste combien de temps là ?

Matthieu : on a rien à dire euh, et si on répétait ce qu’on avait dit la dernière fois * rire de tous*

Antoine : si si [se claque la cuisse] //Eliahou : et qu’est-ce qu’on avait dit ? // qu’il y’ avait le psg , non mais c’ était le psg , vous avez vu ? [Continu de se claquer les cuisses]

Eliahou : ouais je l’ai vu

Antoine : et alors ?

Eliahou : ils ont perdu //Antoine : ah les Chelsea// contre Chelsea //Matthieu : ouais je l’ai vu//

Delmas : non mais euh ça pouvait pas être la dernière fois passeu euh le match euh , il était mardi et s’ est enregistré euh * rire de tous *

Antoine : non mais euh, on a enregistré mardi

Matthieu : on a enregistré lundi [se rapprochant d’Antoine]

Delmas : à 10h * rire de tous * [manipulant un bonhomme en jouet entre les mains]

Antoine : oulaaaa *rire * il me regarde avec ses grands yeux [faisant des grimaces] je vais te manger tout cru, tout nu non [se tape les cuisses et faisant des grimaces ] * rire de tous *

Matthieu : et tout ça il va falloir qu’on retranscrive * rire de tous * // Antoine : c’est pas grave euh //

Eliahou : [fait des gestes] non mais qu’est-ce qu’il est malade ce mec *rire de tous *

Antoine : [montre Delmas du doigt ] non mais dans les didascalies , on mettra les grands yeux , tout cru tout nu , presque tout cru tout nu [touche le jouet de Delmas ] comme BOB notre euh ….

Eliahou : je vous propose de faire une petite dédicace à la prof pour avoir une bonne note, on va parler de …

Antoine : c’ est ça, cette vidéo c’est pour toi [montrant la caméra du doigt]

Matthieu : d’accord

Eliahou : Tu te calmes [en souriant, regardant Antoine].

Antoine : Tu te calmes [en faisant un signe de l’index réprobateur]. Bon d’accord.

Eliahou : Faut parler d’un sujet là assez euh … Euh important, intéressant. [les mains ouvertes, explicatives, les doigts écartés].

Antoine : Les présidentielles américaines [fixant Eliahou, les mains sur les genoux].

Eliahou : Hein ?! (la tête s’approchant d’Antoine)

Eliahou : Qu’est-ce que tu penses de … [la main gauche se levant] // [Matthieu tourne la tête]// Qu’est-ce que j’y connais moi en … démocratie //Antoine : En démocratie pour moi c’est la même chose [Antoine lève la main droite pour saluer une personne qui entre]// en … républicain (bougeant les mains) je sais que Donald Trump il est haut ? [levant la main gauche pour appuyer son propos] mais c’est un milliardaire.

Matthieu : C’est c’est un milliardaire.

Antoine : [Salue à nouveau avec la main droite] Euh … On fait un entretien.

Eliahou : D’embauche.

Matthieu : Ciao !

Eliahou : L’affaire Aurier. [la main gauche ouverte, utilisant son index pour commencer son propos]

Antoine : C’est quoi l’affaire Aurier [interrogatif, se rapprochant de Delmas] ?

Eliahou : Ah ouais l’affaire Aurier rolala, Serge Aurier du PSG.

Antoine : Le PSG ?

Matthieu : Je sais que c’est consternant de débilité rires

Antoine : Mais c’est quoi c’est quoi c’est quoi ? [se rapproche d’Eliahou]

Eliahou : Euuuh …

Matthieu : Je n’ai pas dit

Eliahou : Tu la connais toi l’histoire ? [tournant la tête vers Antoine]

Antoine : C’est un c’est un oui c’est un … [le pouce et le majeur droit sur le menton, se creusant la tête]

Eliahou : C’est comme Snapchat

Matthieu : En live

Eliahou : Ou voilà en en live

Delmas approuve en chuchotant

Antoine : Eh ben eh ben ?

Eliahou : Eh ben il a mis une vidéo de 7/8 minutes //Matthieu : Où il insultait. // où il insultait où il insultait voilà son coach son entraîneur //Matthieu : Et après il s’est excusé, il a dit// ses collègues //Matthieu : genre il a traité des gens de fiottes// voilà //Matthieu : et dans la presse il a dit : « Je ne voulais pas dire fiotte, je voulais dire PD ». D’accord, merci. rires de tout le monde Excuse de malade.//

Eliahou : Ça j’y crois pas trop [pointant son index vers Matthieu]

Matthieu : Vraiment c’était écrit [haussant les sourcils] //Eliahou : Y’a pas que ça aussi //

Antoine : Et ce monsieur, c’était un joueur ? //Eliahou : Oui un joueur de foot //

Antoine : Pourquoi à chaque fois c’est [levant la main et la tapant sur sa cuisse]

Matthieu : Parce qu’ils sont joueurs … de FOOTeuh ! [en s’avançant vers Antoine]

Antoine : Bizarre ce qu’il se passe

Eliahou : Je pense qu’il s’est mis tout le vestiaire à dos //Antoine : Du coup// du coup il va plus jouer jusqu’à la fin de la saison //Matthieu : Tant mieux //Antoine : Ben tant pis pour lui hein [haussant les sourcils] //Eliahou : Mais c’est un très bon joueur //

Antoine : Même si t’es beau, quand t’es con tu vas pas très loin rires

Eliahou : Ouais c’est vrai ça je sais pas… //Antoine : C’est pas // j’ai pas envie de parler des gens politiques [envoie un baiser vers la caméra] //Antoine : C’est pas russe Périscope parce que t’avais Maxime … // //Matthieu : Pas du tout. Nan nan nan nan nan // //Antoine : Bizarre, chelou [en abaissant la tête pour appuyer son propos] //Matthieu : Maxime c’est juste qu’il a trouvé une fille sur Périscope pendant le cours d’UML à poil qui était en train de se déshabiller rires de Matthieu et Eliahou

Antoine : Olalaaa … [mettant une main sur son visage] tu fais quoi Maxime ? Parce que Maxime lorsqu’il travaille c’est //Eliahou : On va faire la version non censurée hein [levant l’index pointant tout le monde du doigt] rires

Matthieu : Ça va être marrant

Antoine : Tout s’est bien passé [appuyant son propos avec une main de bas en haut sur la cuisse] rire

Eliahou : Vous avez quoi là après tout à l’heure ? //Antoine : Bah comme toi, réseaux [frappant sa main sur sa cuisse] ! // //Matthieu : parle doucement On n’y va pas. //…// Moi aussi j’ai rien… Ah réseaux, c’est quoi ?

Antoine : Réseaux, com… T’étais pas là ce matin ? Y’avait cours ce matin de réseaux, il était pas là et du coup c’est toi qui est allé le voir et il a fui Matthieu [pointant Matthieu avec son pouce droit] ? //Matthieu : Nan pas du tout // mais… //Matthieu : Mais moi j’étais, j’me suis pas réveillé//rire

Antoine : nan moi je crois, nan c’est ça c’était Sarah… Sarah qui avait fait m’sieur m’sieur [geste en levant le doigt vers le haut] et lui il s’casse en courant [fait un geste de la main droite mimant une personne qui court] rire général

Delmas : c’était pas Sarah c’était moi en fait [rire de Matthieu en se balançant sur sa chaise] en fait on a attendu déjà 40 minutes // Antoine : ouai ouai // après on est monté chez Mathieu // Matthieu : ils ont DEJA attendus 40 minutes [en s’adressant a Antoine]// lorsqu’on est rentré on l’a vu il était avec une dame il avait l’air euh décontracté [geste des mains imitant la décontraction] on lui a dit « on avait cours » [pointant le doigt vers le haut en le faisant trembler] alors il a dit ah ouais ??! [En prenant la voix de quelqu’un d’étonné] Rire général // Antoine : nan mais il se fout de nous // mais écoutez j’suis désolé euh rigole // Antoine : j’été pas au courant [en frappant ses deux mains sur ses genoux en rigolant très fort // je croyais qu’c’était entre midi et et et deux mais j’sais pas.

Eliahou : nan j’crois qui s’est pas réveillé c’est tout

Matthieu : comme nous rigole // Antoine : p’tit croissant hein // tant pis c’pas grave on n’ira pas c’est tout (…)

Eliahou : moi personnellement j’dois faire mon sport [fait un geste de la main en montrant une direction]

Antoine : ah ouai c’est vrai lui il va à la salle c’est un sportif [en montrant Eliahou du doigt]

Eliahou : lui il fait l’marathon c’est un sportif aussi [en montrant du doigt Antoine]

Antoine : et et la salsa // Eliahou : ah ouai et la salsa rigole // major major de la salsa [en pointant le doigt vers le haut] // Delmas : avec 12 // [rire général et Antoine qui rigole en mettant ses deux mains sur la figure] alors que là en communication [en montrant avec sa main la salle de classe] quand ta 12 c’est la pire des notes alors que là c’est la meilleur

Delmas : ouai ouai

Matthieu : c’est dl’a conneries

Delmas : et encore j’pense qu’on qu’on va s’prendre au moins 17 là

Antoine : PLUS [en élevant la voix, en serrant le poing puis le frappe sur son genou] moi j’veux mille mille mille sûr [en tapant du poing sur son genou à chaque répétition]

    
por ThePassenger 03.04.2016 / 17:09

2 respostas

3

Experimente:

#!/usr/bin/awk -f
BEGIN {
  wordssize=split(s,words,"%");
  if (wordssize==0) {
    words[1]=s;
    wordssize=1;
  }
  characterssize=0;
}
{
  if ($0 ~ /^ *[^:][^:]* *:/) {
    character=substr($1,1,index($0,":")-1);
    for (i=length(character);substr(character,i)==" ";i--){
        character=substr(character,1,length(character)-1);
    }
  }
  if (!lines[character]) {
    lines[character]=1;
    for(i=1; i<=wordssize; i++) {
      markers[words[i] " " character]=0;
    }
    characters[++characterssize]=character;
  } else {
    lines[character]++;
  }
  for(i=1; i<=wordssize; i++) {
    line=$0;
    while ((position=index(line,words[i]))>0) {
      markers[words[i] " " character]++;
      line=substr(line,position+length(words[i]));
    }
  }
}
END {
  printf("%9s %s","Character","Lines");
  for(i=1; i<=wordssize; i++) {
    printf(" %s", words[i]);
  }
  printf ("\n");
  for (i=1;i<=characterssize;i++) {
    printf("%9s %-5d",characters[i],lines[characters[i]],markers[characters[i]]);
    for(j=1; j<=wordssize; j++) {
      printf(" %-" length(words[j]) "d", markers[words[j] " " characters[i]]);
    }
    printf ("\n");
  }
}

Se a linha atual começar com letras e : , a variável caractere será atribuída ao nome encontrado. Cada linha de texto é contada para cada caractere. Cada vez que a seqüência de pesquisa (por exemplo, ? ) é encontrada, o contador do marcador do caracter é incrementado.

Se um personagem falar várias linhas, o script acima será bem-sucedido para contar a sequência, por exemplo, ? , em todo o bloco de linhas.

A string a ser pesquisada é especificada com -v s="?" . Várias strings podem ser pesquisadas ao mesmo tempo. Separe as strings para pesquisar com % : -v s="?% //" .

O script pode pesquisar vários arquivos de uma só vez se houver mais de um nome de arquivo.

Na saída, os caracteres são listados na ordem de aparição.

O teste:

$ chmod +x compteur
$ ./compteur -v s="?%//%'%t'es" Communication
Character Lines ? // ' t'es
  Antoine 2     0 1  0 0
  Eliahou 3     3 0  3 1
   Delmas 3     0 1  3 0

$ ./compteur -v s="?" Communication
Character Lines ?
  Antoine 2     0
  Eliahou 3     3
   Delmas 3     0

----

primeira versão do histórico

#!/usr/bin/awk -f
{
  if ($1 ~ /^[^:][^:]*:/) {
    character=substr($1,1,index($1,":")-1);
  }
  line=$0;
  lines[character]++;
  while ((position=index(line,s))>0) {
    markers[character]++;
    line=substr(line,position+length(s));
  }
}
END {
  printf("%9s %s %s","Character","Lines",s);
  for (character in lines) {
    printf("\n%9s %-5d",character,lines[character]);
    if (markers[character]) {
      printf(" %-3s",markers[character]);
    }
  }
  printf("\n");
}
    
por 03.04.2016 / 18:44
1

Supondo que a variável a da shell contém a string que você está procurando e assumindo que essa string nunca faz parte do nome de qualquer pessoa (se for, o grep -pattern precisa ser estendido para corresponder somente após a primeira : ) e assumindo que : nunca faz parte do nome de qualquer pessoa e assumindo que a não contém uma nova linha:

cat Communication | grep -F "${a}" | awk -F ':' '{print $1}' | sort | uniq -c

Não escape do conteúdo de a , porque existe a -F -option para grep . O conteúdo de a é considerado literalmente (contanto que não contenha uma nova linha).

Se os nomes da pessoa puderem conter a string que você está procurando, o seguinte funciona, mas tenha em mente os caracteres em a , que podem ter um significado especial correspondente a grep (ou seja, se você procura . , mas \. em a , se você procurar por ? , use \? , etc.):

cat Communication | grep -E "^[^:]*:.*${a}" | awk -F ':' '{print $1}' | sort | uniq -c

Ou, em particular, respostas a três das suas subquestões:

who asks questions (who have a "?" in their quote), how much time

cat Communication | grep -F '?' | awk -F ':' '{print $1}' | sort | uniq -c

who cut someone off, (who have a "//" in their quote)

cat Communication | grep '//' | awk -F ':' '{print $1}' | sort | uniq -c

who does some elision ("t'es" instead of "tu es" ("you're" instead of "you are") and at which frequency...

cat Communication | grep "'" | awk -F ':' '{print $1}' | sort | uniq -c

(Eu sei que todos são "uso inútil de gato", mas torna o fluxo de dados mais claro para primeiro cat e depois canaliza para grep . Também é possível usar grep -F "${a}" Communication | [...] etc.)

    
por 03.04.2016 / 17:39