uniq -c로 생성된 첫 번째 열을 계산하는 방법

uniq -c로 생성된 첫 번째 열을 계산하는 방법

나는 각각 새로운 줄에 "See Spot" "See pot run" 등의 임의의 단어 5줄을 나열하는 파일을 가지고 있습니다. 각 단어가 파일에 나타나는 횟수를 계산하고 올바르게 정렬하는 코드를 만들 수 있었습니다.

4 Spot  
3 run  
2 see  
1 sees  
1 Run  
1 Jane  

내가 사용하는 코드:

cat "FILENAME" | tr ' ' '\n' | sort -n | uniq -c | sort -r  

각 단어를 새 행에 넣고 정렬한 다음 고유한 값을 세어 다시 정렬합니다. 이제 계산을 해야 하는데 결과는 다음과 같습니다.

3 1  
1 2  
1 3  
1 4  

즉, 개수가 1인 단어가 3개, 2개 단어가 1개, 3개 단어가 1개, 4개 단어가 1개 있습니다.

두 가지 질문이 있습니다. 1은 uniq -c에서 이미 개수인 첫 번째 열의 개수를 가져오는 방법입니다. 두 번째 문제는 두 번째 열의 단어를 제거하고 원래 개수인 1,2,3,4로 바꾸는 것입니다.

답변1

다음을 수행할 수 있습니다.

tr ' ' '\n' <infile \
 | sort -n \
 | uniq -c \
 | awk '{ seen[$1]++ } END{for (x in seen) print seen[x], x }'

심지어:

tr ' ' '\n' <infile | sort -n | uniq -c|cut -d' ' -f7 |sort |uniq -c

아니면 그 자체로 더 좋습니다 awk:

awk '{ seen[$0]++ } 
    END{ for (x in seen) count[seen[x]]++; for (y in count) print count[y],y }
' RS='( |\n)+' infile
3 1
1 2
1 3
1 4

위의 awkseen[$0]++항목에 대해오른쪽기록,에스\n전체 레코드는 공백이나 ewlines로 구분된 키라는 연관 배열에 저장되며 seen, 동일한 키가 다시 표시되면 해당 값이 증가됩니다.

END{ ... }이 블록은 모든 레코드를 읽을 때 실행되며 각 키( x이 배열의 모든 요소를 ​​반복하기 위해 변수 인덱스 로 정의함)에 대해 실행됩니다.~을 위한루프)가 배열에 저장되어 있으므로 값을 사용했습니다. seen[x]새로운 배열의 키로 호출되며, count동일한 키의 값이 다시 증가됩니다.

나중에 우리는 다른 루프와 y변수 인덱싱을 사용하여 먼저 해당 값 count[y](카운트)과 y키를 인쇄합니다.

관련 정보