"X"와 "Y"가 몇 줄인지 알려주는 스크립트를 작성해 보세요.

"X"와 "Y"가 몇 줄인지 알려주는 스크립트를 작성해 보세요.

저는 언어학 과정을 수강하고 있으며 질문한 사람 수 계산과 같은 반복적인 작업을 수행하는 데 도움이 되는 쉘 스크립트를 사용하고 싶습니다. 이것은 내가 열고 명령을 사용한 gedit파일의 일부 입니다.

앙투안: 나는 당신이다

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

델마스: 줄을 서서 기다리지 마세요.

Eliahou: 지시 사항이 없습니다. 도착합니다...

앙투안: //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"가 포함된 행 수를 알려주는 일반 스크립트를 작성하려고 합니다. 예를 들어, 변수와 연관된 이름과 해당 이름이 나타나는 횟수를 제공하는 스크립트를 작성하는 방법을 찾고 있습니다. 예를 들어, 대화 중에 엘리야후는 두 가지 질문을 했습니다.

더 구체적으로:

  • 누가 질문을 하고(누구의 인용문에 "?"가 포함되어 있는지) 질문하는 데 시간이 얼마나 걸립니까?
  • 누군가를 방해하는 사람(인용문에 "//"가 포함되어 있음)
  • 누군가의 말을 반복하는 사람
  • 누가 일부 생략을 했고("tu es" 대신 "t'es"("you are" 대신 "you're")), 얼마나 자주...

가장 먼저 떠오르는 사람을 위해

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

엘리아호: 기쁘네요! 별말씀을요!

매튜: 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 verifier.

Eliahou: 아니요, 자유방임은 안 됩니다 // Matthieu: 주의하세요 bouge pas non plus [Matthieu s'assoit] // 아니요, no 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 présente un lapin-crétin] Les amis j'vous présente Bob, Bob le gri-gri.

델마스: 여기가 포럼의 무대입니다.

Antoine: Salut les amis, Hey!(il lève unourcil) 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, Mathieu Suit du Respect]

Eliahou: Tu l'as eu au 포럼, 장르 [il point le gri-gri du doigt]? //

앙투안: 이건 가석방이에요. [앙투안 푸앵테 델마스 두두이트]//

델마스: 안녕하세요, 유비소프트입니다.

앙투안:* 난 정말...

Eliahou: [se penche] *Chez Ubisoft? T'as du faire la 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 voice quand même.

엘리아호: 하, 지금 나한테 말하는 거야?

델마스: 그렇죠.

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 트럭 6대. [인정하고 떠나다]

델마스: //우아이, 보세요.

Eliahou: 아 여섯 모이세스, 아 와이? 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 devices nan mais vraiment, Yan a ya des personnes, [ Delmas lève le doigt) et tu lai...//앙투안: 하하! ! ! 이거 브라이야? //

마티유(Mathieu): 무함마드의 수호자, 항상 유동적인 수입.

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

Matthieu: 마리암과 함께 즐거운 시간을 보낼 수 있는 좋은 시간이야, 나쁜 일이야, 부퍼야, 나쁜 일이야, 나쁜 일이야

엘리야후: 세리에? (나레이션) 푸틴, 홀랄라 //델마스: 펑! (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 devices 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 enie de faire la queue// toi tu veux ton p 가슴 장치,^(ton petit lapin-crétin) 힌 힌 힌? //Eliahou: Et j'veux는 가제트를 추천합니다. E::::t puis euh dès que j'arrive à unmoment chui jusqu'au bout du forum e:::t yavait personne, ché plus c'était qui quelle société ils cherchaientt des Stagiaires.. .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: 나는 자유를 사랑해요, 내 이력서 으으으으, 내 경비원, 내 나, 내 나, 내 친구들

앙투안: 어허 레 이력서

델마스: 이게 내 일인가요? [En faisant le geste avec les mains]

Eliahou : ouais [hoche la tête]

Delmas : ils l'ont plié [앙투안 : claque des mains]Lired Tous

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

Matthieu: oh ca veut tout dire [se gratte lepied 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 presents alors ? ]>> 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 luiiiiiiiii [en donnant des point sur ses cuisses] non mais, il beh il Marchait pour moi // Eliahou: ça c' est vrai, il Change a 사진 // 마티유

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

마티유: 아, 그렇군요

앙투안: 수학이 십대들 사이에 흔하다는 걸 알고 있었나요? [Hoche la tête et se Tape à plusieurs reprises les cuisses] *rire de tous *

델마스: C는 이미 사실인가요? [Tendant la main vs 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 ?//

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

엘리야후: 무대 위의 당신의 노래

앙투안: 나는 내 고향이다

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*

Antoine: 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 // 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 * Ribe de tous *

Antoine: non mais euh, enregistré mardi

Mathieu: on a enregistré lundi [se rapprochant d'Antoine]

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

Antoine: oulaaaa *rire * I care 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 으 //

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

엘리아호: 좋은 소원이 있어요. 교수님에게 좋은 소원을 빌어주세요...

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

매튜: 꾸준해요

Eliahou: Tu te 진정해 [en soriant, Dear Antoine].

앙투안: Tu te chilles [en faisant un Signe de l'index réprobateur]. 행운을 빌어요.

Eliahou: Faut parler d'un sujet là assez 어… 어, 중요하고 흥미롭네요. [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 me [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] 글쎄요…

엘리아조: 다부쉬.

마티유: 안녕!

Eliyahou: 오리에 사건. [la main gauche ouverte, 실용적인 아들 인덱스 부어 스타터 아들 제안]

앙투안: C'est quoi l'affaire Aurier [쿼리, se rapprochant de Delmas]?

엘리야후: 아, 오리에 롤라라, 파리 생제르맹의 세르주 오리에.

앙투안: 파리 생제르맹?

마티유: 내 생각엔 이것이 정상적인 약함 상태라고 생각해요리레스

앙투안: 이게 다야? [se rapproche d'Eliahou]

엘리아조: 어휴...

마티유: 난 당신을 사랑하지 않아요

엘리아호: 역사를 아시나요? [앙투안과의 대결]

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: 실시간으로 시청하세요.

델마스는 츄쵸탄의 말에 동의한다

앙투안: 어 벤 어 벤?

Eliahou: 음, 7~8분 분량의 동영상입니다. //Matthieu: Où il 모욕입니다. // où il 모욕 ou il 모욕 voilà son 코치 son entraîneur //Matthieu : Et après il s'est excusé, il a dit// ses collègues //Matthieu : Genreil 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 lesourcils] //Eliahou : Y'a pas que ça aussi //

앙투안: 어떤 것에 관심이 있으신가요? //Eliahou : Oui un joueur de foot //

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

마티유: Parce qu'ils sont joueurs... de FOOTeuh! [앙 샤방(en s'avant) 대 앙투안(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 lesourcils] //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 enie 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 just a trouvé une fille sur Périscope 펜던트 le cours d'UML à poil Train your train 리레스 드 마티외와 엘리야후

Antoine: Olalaaaa... [mettant une main sur son facesage] 당신은 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]리레스

마티유: Ça va être marrant

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

엘리아호: 지금 또 하고 싶은 일이 있나요? //앙투안: Bah comme toi, réseaux [frappant sa main sur sa cuisse]! // //매튜: 팔레 문서뉴욕에서. //...// Moi aussi j'ai rien... 아 réseaux, 이게 쿼이인가요?

앙투안: 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é//릴리

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]주지사 신문

Delmas : c'était pas Sarah c'était moi en fait [rire de Matthieu en se balançant sur sa chaise] en fait on a déjà 40분 // Antoine : ouai ouai // après on est monté chez Mathieu // Matthieu : ils ONT DEJA 참석 40분 [en s'adressant 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 vs le haut en le faisant trembler] alors il a dit ah ouais ?? [En prenant la voix de quelqu'un d'étonné]일반 원칙// Antoine: 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 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 grave on n'ira pas c'est tout (…)

엘리아후

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]

앙투안: et et la salsa // Eliahou: ah ouai et la salsa리골레// 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 communications [en montrant avec sa Main Salle de classe] quand ta 12 c'est la pire des note alors que là c'est la meilleur

델마스: 와이 와이

매튜: 이쪽은 코너리예요

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

앙투안: 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]

답변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

쉘 변수 a에 찾고 있는 문자열이 있다고 가정하고 문자열이 누구의 이름에도 포함되지 않는다고 가정하고(만일 그렇다면 패턴은 grep첫 번째 문자열 이후에만 일치하도록 확장되어야 함 :) :결코 누구의 이름에도 포함되지 않는다고 가정합니다. 개행 문자가 없다고 가정하는 사람 이름의 일부 a:

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

- 옵션이 a있으므로 내용을 이스케이프하지 마십시오 . 의 내용은 문자 그대로 간주됩니다(줄바꿈 문자가 포함되지 않는 한).-Fgrepa

사람의 이름에 찾고 있는 문자열이 포함될 수 있는 경우 다음이 작동합니다. 그러나 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

누가 일부 생략을 했고("tu es" 대신 "t'es"("you are" 대신 "you're")), 얼마나 자주...

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

(이 모든 것이 "고양이의 쓸모없는 사용"이라는 것을 알고 있지만 먼저 cat파이프를 통해 들어오는 데이터 흐름을 더 깔끔하게 만듭니다 grep. 대신 등을 사용할 수도 있습니다 grep -F "${a}" Communication | [...])

관련 정보