파일의 첫 번째 열에서 발생 횟수 계산


10

이 파일이 있습니다 :

1 2 
1 3
1 2
3 3
52 1
52 300

그리고 1000 이상.

첫 번째 열에서 각 값이 발생하는 횟수를 계산하고 싶습니다.

1  3 
3  1
52 2

이것은 우리가 1세 번 보았다는 것을 의미 합니다.

Perl, AWK 또는 Bash에서 어떻게 할 수 있습니까?


3
안녕 아라 샴! 나는 당신이 최근에 같은 주제를 중심으로 매우 비슷한 질문을하는 것을 보았습니다. 커뮤니티에서 도와 드리고 싶지만 이미 시도한 내용과 정확한 위치를 알려줄 수 있습니까? 우리는 사람들이 질문을하기 전에 약간의 노력을 보여줄 것을 요구합니다. 단순히 다른 사람에게 당신에게 특정한 것에 대한 코드를 제공하도록 요구하는 것으로부터 배우는 것은 없습니다. 이것의 배경이 정확히 무엇인지 알려주지 않겠습니까? 어쩌면 원하는 것을 쉽게 달성 할 수있는 방법이있을 수 있으며 추상 숫자가있는 더미 예제에 의존 할 필요가 없습니까?
slhck

당신의 도움을 위해 tnx. bgpdump 데이터로 작업하고 파싱하고 있습니다.
Arash

답변:


12

입력이 정렬되면 uniq을 사용할 수 있습니다.

<infile cut -d' ' -f1 | uniq -c

그렇지 않은 경우 먼저 정렬하십시오.

<infile cut -d' ' -f1 | sort -n | uniq -c

산출:

  3 1                                      
  1 3
  2 52

출력이 요구 사항에 비해 awk '{ print $2, $1 }'바뀌고이를 사용 하여 변경할 수 있습니다 .

1 3 
3 1
52 2

정렬 된 입력이 필요없는 awk 관용구도 있습니다.

awk '{h[$1]++}; END { for(k in h) print k, h[k] }'

산출:

1 3
52 2
3 1

여기서 출력은 해시에서 나오므로 순서가 지정되지 않으므로 sort -n필요한 경우 전달하십시오 .

awk '{h[$1]++} END { for(k in h) print k, h[k] }' | sort -n

GNU awk를 사용하는 경우 awk 내에서 정렬을 수행 할 수 있습니다.

awk '{h[$1]++} END { n = asorti(h, d, "@ind_num_asc"); for(i=1; i<=n; i++) print d[i], h[d[i]] }'

마지막 두 경우의 결과는 다음과 같습니다.

1 3
3 1
52 2

tnx .its 효과 :)
Arash

코드를 설명 할 수 있습니까 ??? awk '{h [$ 1] ++} END {for (k in h) print k, h [k]}'| sort -n
Arash

3
@arashams : {h[$1]++}각 라인에 대해 블록이 평가됩니다. h는 해시이며 $1첫 번째 열이며의 키로 사용됩니다 h. 그래서 이것은 얼마나 자주 고유 한 $1것으로 보이는지를 나타냅니다. END블록은 입력 끝에서 실행하고, 키 및 탈리가 인쇄된다. sort -n출력을 숫자로 정렬합니다.
Thor
당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.