다음과 같은 내용이 포함된 파일이 있습니다.
red dog
red cat
red bird
red horse
blue hamster
blue monkey
blue lion
pink pony
pink whale
pink pig
pink dolphin
모든 색상에 대해 카운터를 증가시키고 모든 동물에 대해 카운터를 증가시켜야 합니다. 따라서 빨간색은 1, 파란색 2, 분홍색 3이 됩니다. 다음으로 개, 고양이, 새, 말은 1, 2, 3, 4가 됩니다. 새로운 색상을 시작하기 때문에 햄스터가 1에서 다시 시작해야 합니다.
해당 파일을 "읽는 동안 색상 동물"을 수행하는 경우 색상이 더 이상 이전 색상과 같지 않은 경우를 비교하려면 어떻게 해야 합니까?
나는 다음과 같은 것을 찾고 있습니다 :
1.1
1.2
1.3
1.4
2.1
2.2
2.3
3.1
3.2
3.3
3.4
어떤 제안이라도 크게 감사하겠습니다 :)
답변1
다음과 같은 것 awk
:
$ awk '$1 != c { cc++; c=$1; ac=0; a="" } $2 != a { ac++; a=$2 } { printf("%d.%d\n", cc, ac) }' file
1.1
1.2
1.3
1.4
2.1
2.2
2.3
3.1
3.2
3.3
3.4
스크립트 awk
는 다음 네 가지 사항을 추적합니다.
- 가장 최근에 읽은 동물 이름은
a
. - 가장 최근에 읽은 색상은
c
. - "동물 카운터",
ac
. - "색상 카운터",
cc
.
입력의 두 열에 있는 내용에 따라 이러한 변수를 업데이트합니다.
- 색상이 가장 최근에 읽은 색상과 동일하지 않은 경우 증분하여
cc
기억하세요.이것대신 색상을 지정합니다. 또한 재설정ac
및a
. - 동물이 가장 최근에 읽은 것과 동일하지 않으면 증분
ac
하고 기억하세요.이것대신 동물.
그런 다음 입력의 각 줄에 대해 cc
및 를 인쇄하십시오 .ac
각 줄의 동물이 고유하다고 보장되면 변수를 제거할 수 있습니다 a
.
답변2
perl -pale '$_ = join ".", reverse ++$h{$F[0]}, scalar keys %h'
해시는 언제든지 키 수를 %h
보유 keyA => count
하고 반환합니다. scalar keys %h
그런 다음 결과를 뒤집어서 쉼표로 연결합니다.
결과
1.1
1.2
1.3
1.4
2.1
2.2
2.3
3.1
3.2
3.3
3.4