编写一个脚本,给出其中有多少行有“X”和“Y”?

编写一个脚本,给出其中有多少行有“X”和“Y”?

我正在学习语言学课程,我想使用 shell 脚本来帮助我做一些重复的事情,例如计算谁提出问题。这是我打开并使用gedit命令的文件的一部分

安托万:我是你

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

Delmas:不要排队。

Eliahou:指示 ils t'ont donné ça,我们到达...

安托万://Bonjour je voudrai un lapin-crétin。

Delmas:Eu::f//,Euh un 'tit voice quand même。

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

德尔马斯:Oui bien sûr。

我正在寻找编写一个通用脚本,给出其中有多少行有“X”和“Y”?例如,我正在寻找如何编写一个脚本来给出与变量关联的名称和名称出现的次数。例如,在对话中,埃利亚胡问了两个问题。

更确切地说:

  • 谁提出问题(谁的报价中有“?”),需要多长时间
  • 谁打断了某人的话(他们的引言中有一个“//”)
  • 谁重复某人的句子
  • 谁做了一些省略(“t'es”而不是“tu es”(“you're”而不是“you are”)以及频率......

对于我想到的第一个

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

其结果是:

MyComputer:~$ sh compteurQuestions ? Communication
8

可是,我却没有拥有这样指挥权的人……那我该怎么做才能拥有他们呢?

我知道我应该使用

^........

因为这里名字的最大长度是8。但是这是一个相当残酷的方法,我正在寻找一个更优雅的方法

我尝试使用 Jay jargo 提供的很棒的脚本,但在用实际文本编写后似乎存在问题$ compteurQuestions -v s="?" exempleCommunication,我明白了Delmas 12 0。然而,德尔马斯至少问了一个问题:Delmas : ils l’ont plié ?

实际文本

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

Eliahou:这是我的荣幸!这是我的荣幸!

马修: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, ya rien qui va bouger, t'inquiète assieds-土井。 * Non mais //Matthieu: Mais ça va pas bouger.// non, mais au moins pour vérifier。

Eliahou:不,不放任 //Matthieu:注意 bouge pas non plus [Matthieu s'assoit] // 不,不 mais c'est mieux qu'on se voit。 //安托万:丝丝//南,南

马修: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'ordur] //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。

德尔马斯:这是论坛的舞台。

安托万: 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 commien...// [Delmas prend le lapin] -crétin,马蒂厄西装杜尊重]

Eliahou:Tu l'as eu au 论坛,流派 [il point le gri-gri du doigt]? //

安托万:这就是假释。 [安托万·普安特·德尔马斯·杜多伊特]//

德尔马斯:你好,育碧。

安托万:* 我 a dû...

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

Delmas:不要排队。

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

Eliahou:哈,你有和我说话吗?

德尔马斯:是的。

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 selected vers soi]“Chpeux prendre quand même ça”。这就是。

德尔马斯:瞧。 [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六辆卡车。 [默许并离开]

德尔马斯://Ouai,瞧。

Eliahou:啊六个莫伊斯,啊ouai? Hier chuiparti [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, Yan a ya des personnes, [ Delmas lève le doigt) et tu lai...//安托万:呵呵!!!这就是vrai吗?//

马蒂厄:穆罕默德的守护者,所有的时间都是液体的收入。

安托万:哈哈哈! [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

埃利亚胡:塞里厄? (旁白)Putain,holala //Delmas:噗! (tête sur le côté)Euuuuh La vérité,Hier j'y étais mais pas //pour ramasser//

安托万:(听不清)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.

安托万:欣欣欣! 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'medemandais

安托万:Ca m'parait louche [pointe Eliahou du doigt],là louche

Eliahou:Ca m'paraissait louche。

安托万:Ca m'paraissait louche [pointe le doigt vers le ciel]

Eliahou:我爱自由,我的cv euhhhh ,我的守卫,我的我,我的我,我的朋友

Antoine:呃呃 les cv

德尔马斯:这是我的事吗? [En faisant le geste avec les mains]

Eliahou : ouais [hoche la tête]

Delmas : ils l'ont plié [Antoine : claque des mains]里雷德托乌斯

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……...

安托万 : [croise les pieds] mais mais mais , moi j' avais les cv pour luiiiiiiiii [ en donnant des point sur ses cuisses ] non mais , il beh il Marchait pour moi // Eliahou : ça c' est vrai , il changeait juste la photo // // Matthieu : 参加 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坟墓]

马蒂厄:啊,beuh ouais

安托万:你是否知道数学在青少年中是常见的? [Hoche la tête et se Tape à plusieurs reprises les cuisses] *rire de tous *

德尔马斯: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 [bai​​sse la tête et croise les mains sur ses genoux] // [serre ses doigts]

埃利亚霍:这封信写完了吗? [Regardant Matthieu et lui tentant 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 ?//

马修 : je déteste ça, [regarde Antoine dans les yeux], [Eliahou se mordille lesongles des doigts]*rire d'Antoine *// Delmas : 瞧 //

埃利亚胡:你的舞台上的歌

安托万:我是我的故乡

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

安托万 : 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 ](沉默)

埃利亚胡:不就已经结束了吗? // Delmas : Non mais c'est chaud hein // il Reste Comien de temps là ?

马蒂厄:On a rien à dire euh, et si on répétait ce qu'on avait dit la dernière fois * rire de tous*

安托万:si si [se claque la cuisse] //Eliahou:et qu'est-ce qu'on avait dit ? // 你可以使用 psg 吗,但你不想使用 psg 吗? [继续使用 claquer les cuisses]

埃利亚胡:我爱你

安托万:等人?

Eliahou : ils ont perdu //Antoine : ah les 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 *

安托万:non mais euh,在 enregistré mardi

马蒂厄:on a enregistré lundi [se rapprochant d'Antoine]

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

安托万 : oulaaaa *rire * 我关心 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 vafalloir qu'on retrancrive * rire de tous * // Antoine : c'est pas heaven euh //

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

安托万:[montre Delmas du doigt]non mais dans les didascalies,on metra les grands yeux,tout cru tout nu,presque toout cru tout nu [touche le jouet de Delmas]comme BOB notre euh …。

Eliahou:我向您提出一个美好的小愿望,请您向教授提出一个美好的愿望,关于……

安托万 : c' est ça, cette vidéo c'est pour toi [montrant la caméra du doigt]

马修:一致

Eliahou:Tu te calmes [en souriant,尊敬的安托万]。

安托万:Tu te calmes [en faisant un Signe de l'index réprobateur]。祝您好运。

Eliahou:Faut parler d'un sujet là assez euh … 呃,重要,有趣。 [les mains ouvertes, explicatives, les doigts écartés]。

安托万:Les présidentielles americaines [fixant Eliahou, les mains sur les genoux]。

埃利亚霍:海因?! (la tête s'approchant d'Antoine)

Eliahou : Qu'est-ce que tu penses de … [la main gauche se lvant] // [Matthieutourne la tête]// Qu'est-ce que j'y connais moi en … démocratie //Antoine : En démocratie pour我选择了 [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。

马修:这就是百万富翁。

安托万:[Salue à nouveau avec la main droite] 呃……On fait un entretien。

埃利亚霍:D'embauche。

马蒂厄:再见!

埃利亚侯:奥里耶事件。 [la main gauche ouverte, utilisant son index pour starter son propos]

安托万:C'est quoi l'affaire Aurier [询问,se rapprochant de Delmas]?

埃利亚胡:啊,奥里耶·罗拉拉,巴黎圣日耳曼的塞尔日·奥里耶。

安托万:巴黎圣日耳曼?

马蒂厄:我说这就是衰弱的常态里雷斯

安托万:这就是这吗? [se rapproche d'Eliahou]

埃利亚霍:呃呃……

马蒂厄:我不爱你

Eliahou:你知道历史吗? [与安托万的对决]

安托万 : 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:这是 Snapchat

马蒂厄:现场

Eliahou:Ou voilà en en live

德尔马斯赞同楚乔坦

安托万:呃本呃本?

Eliahou:嗯,这是一个 7/8 分钟的视频 //Matthieu:Où il 侮辱。 // où il 侮辱 où il 侮辱 voilà son coach son entraîneur //Matthieu : Et après il s'est excusé, il a dit// ses collègues //Matthieu : 流派 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 »。一致,谢谢。全世界的一切对不起,马拉德。//

Eliahou : Ça j'y crois pas trop [指向儿子索引与马蒂厄]

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

安托万:先生,你有什么兴趣吗? //Eliahou : Oui un joueur de foot //

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

马蒂厄:Parce qu'ils sont joueurs ... de FOOTeuh! [en s'avançant vers Antoine]

安托万:过去的怪事

Eliahou : Je pense qu'il s'est miss tout le ventiaire à 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 //

安托万:我是你的美人,你是我的情人 里雷斯

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 里雷斯·德·马蒂厄和埃利亚胡

安托万:Olal​​aaa ... [mettant une main sur son facesage] 你是马克西姆吗? 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]里雷斯

马蒂厄 : Ça va être marrant

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

Eliahou:您现在还想做什么吗? //安托万:Bah comme toi, réseaux [frappant sa main sur sa cuisse] ! // //马蒂厄: 帕尔莱杜塞门特在纽约。 //...// Moi aussi j'ai rien... 啊 réseaux,这就是 quoi 吗?

安托万:Réseaux,com…T'étais pas là ce matin ?你是否在早晨的早晨, 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é//里雷

安托万 : 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]总督报

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 分钟 // Antoine : ouai ouai // après on est monté chez Mathieu // Matthieu : ils ont DEJA attendus 40 分钟 [en s'adressant a Antoine]// lorsqu'on estrentré 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é]总则// 安托万 : nan mais il se fout de nous // mais écoutez j'suis désolé euh里戈莱// 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

马蒂厄:comme nous里戈莱// 安托万 : p'tit croissant hein // tant pis c'pas 坟墓 on n'ira pas c'est tout (…)

Eliahou : moi personlement j'dois faire mon sport [fait un geste de la main en montrant une Direction]

安托万 : 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]

安托万 : et et la salsa // 埃利亚侯 : ah ouai et la salsa里戈莱// 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 lafigure] alors que là en communications [en montrant avec sa Main la salle de classe] quand ta 12 c'est la pire des note alors que là c'est la meilleur

德尔马斯 : ouai ouai

马修:这就是康纳利

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

安托万 : PLUS [en elevant 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]

答案1

尝试一下:

#!/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");
  }
}

如果当前行以字母开头并且:, 这特点变量被分配找到的名称。每行文本均针对每个字符进行计数。每次搜索的顺序(例如) 遇到时,字符的标记计数器会增加。

如果一个角色说了几行,上面的脚本将成功计算出序列,例如,在整个行块中。

要搜索的字符串指定为-vs=“?”。可以同时搜索多个字符串。分隔要搜索的字符串%:-vs="?% //"

如果有多个文件名,该脚本可以一次搜索多个文件。

在输出中,字符按出现顺序列出。

考试:

$ 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

----

历史的第一个版本

#!/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");
}

答案2

假设 shell 变量a保存您正在查找的字符串,并假设该字符串永远不是任何人姓名的一部分(如果是,则 - 模式grep需要扩展以仅在第一个之后匹配:)并假设它:永远不是任何人姓名的一部分人名并假设a不包含换行符:

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

不要转义 的内容a,因为有-F- 选项grep。的内容a按字面意思理解(只要它不包含换行符)。

如果人名可以包含您要查找的字符串,则以下方法有效,但请记住转义其中a可能具有特殊模式匹配含义的任何字符grep(即,如果您查找.,但\.进入a,如果您寻找?、使用\?等):

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

或者,特别是回答您的三个子问题:

谁提出问题(谁的报价中有“?”),需要多长时间

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

谁打断了某人的话(他们的引言中有一个“//”)

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

谁做了一些省略(“t'es”而不是“tu es”(“you're”而不是“you are”)以及频率......

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

(我知道所有这些都是“猫的无用使用”,但它使数据流更清晰,首先然后cat通过管道进入grep。也可以使用grep -F "${a}" Communication | [...]等代替)

相关内容