고쳐 쓰다

고쳐 쓰다

다음과 같은 대화 내용을 담은 텍스트 파일이 있습니다.

Speaker1: Hello. 
Speaker2: Hi. 
Speaker2: How are you? 
Speaker1: Well thanks.

화자가 몇 번이나 왔는지 세고 싶어요다양성한 줄에서 다른 줄로. 따라서 이 예에서는 2가 됩니다(1~2행, 3~4행, 2~3행은 아님).

답변1

$ awk -F':' '(NR>1) && ($1!=prev){c++} {prev=$1} END{print c+0}' file
2

답변2

Python 모듈에는 값이 변경될 때마다 키의 데이터를 그룹화하는 itertools메서드가 있습니다 . groupby콜론으로 구분된 첫 번째 필드를 키로 사용하고 그 주위로 그룹화합니다.

python3 -c 'import sys, itertools as it
k,g = -1,lambda x: x.split(":")[0]
with open(sys.argv[1]) as f:
  for t in it.groupby(f,g): k += 1
print(k)
' file
2

GNU sed한 번에 두 줄을 보면 이 작업을 수행할 수 있습니다. 콜론으로 구분된 첫 번째 필드가 다른 경우 예약에 줄바꿈 문자를 추가합니다. eof에서는 sed가 인쇄할 때 암시적으로 추가하는 개행 문자를 설명하기 위해 개행 문자를 제거한 후에도 인쇄가 유지됩니다.

sed -En '
  $!N
  /^([^:]+:).*\n\1/!{x;s/$/\n/;x;}
  $!D
  g;s/.//p
' file|wc -l

Perl은 후루룩 모드(0777)에서 정규식의 힘을 사용하여 콜론으로 구분된 동일한 첫 번째 필드의 연속 중복 행을 제거합니다. 그런 다음 개행 횟수를 셉니다.

perl -pl -0777 -e '
  s/^(([^:]+:).*\n)(?:\2.*\n)+/$1/mg;
  $_ = tr/\n// -1;
' file

답변3

누적 "파이프라인" 방법은 다음과 같습니다.

  • 화자(첫 번째 콜론) 뒤의 모든 내용을 잘라냅니다.cut -f1 -d:
  • 중복 제거:uniq
  • 행 계산:wc -l

그러므로 cut -f1 -d: < yourfile | uniq | wc -l원하는 결과가 나와야 한다.

고쳐 쓰다

@EdMorton이 관찰한 대로 결과는 하나(다양성행 수에서 1을 뺀 숫자, 위의 숫자가 행 수입니다). 관리할 수 있다면 이 점을 고려하세요. 그렇지 않으면 : uniq뒤에 첫 번째 줄을 건너뛰는 단계를 추가할 수 있습니다 uniq | tail -n +2.

답변4

Raku(이전 Perl_6) 사용

raku -e '(-1 + slurp.split(/<[:\v]>/)[0,2,4...*]>>.match(/\d+$/).[0..(*-2)]>>.Int.squish.elems).say;'

또는

raku -e '(-1 + slurp.comb(/ ^^ \w+ <(\d+)> \: \s /).squish.elems).say;'

간단히 말해서(위의 두 번째 솔루션) slurp파일 comb선택은 ^^줄 시작, \w+alnum(s), \:콜론 및 \s공백 과 일치하는 요소를 순서대로 일치시키고 <(…)>연산자를 사용하여 숫자를 제외한 모든 것을 제거하고 squish인접한 동일한 숫자 중 하나만 남겨두고 숫자를 가져옵니다. 요소를 선택 elems하고 -1(1 빼기) say답을 얻습니다.

입력 예(OP, 2X 반복):

Speaker1: Hello. 
Speaker2: Hi. 
Speaker2: How are you? 
Speaker1: Well thanks..
Speaker1: Hello. 
Speaker2: Hi. 
Speaker2: How are you? 
Speaker1: Well thanks..
Speaker1: Hello. 
Speaker2: Hi. 
Speaker2: How are you? 
Speaker1: Well thanks..

예시 출력( perl6 -e 'slurp.comb(/ ^^ \w+ <(\d+)> \: \s /).say;')

(1 2 2 1 1 2 2 1 1 2 2 1)

예시 출력( perl6 -e 'slurp.comb(/ ^^ \w+ <(\d+)> \: \s /).squish.say;')

(1 2 1 2 1 2 1)

출력 예(마지막으로 위에서 두 번째 코드 줄):

6

https://raku.org

관련 정보