다음과 같은 대화 내용을 담은 텍스트 파일이 있습니다.
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