나는 각각 새로운 줄에 "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
위의 awk
각 seen[$0]++
항목에 대해오른쪽기록,에스\n
전체 레코드는 공백이나 ewlines로 구분된 키라는 연관 배열에 저장되며 seen
, 동일한 키가 다시 표시되면 해당 값이 증가됩니다.
END{ ... }
이 블록은 모든 레코드를 읽을 때 실행되며 각 키( x
이 배열의 모든 요소를 반복하기 위해 변수 인덱스 로 정의함)에 대해 실행됩니다.~을 위한루프)가 배열에 저장되어 있으므로 값을 사용했습니다.본 seen[x]
새로운 배열의 키로 호출되며, count
동일한 키의 값이 다시 증가됩니다.
나중에 우리는 다른 루프와 y
변수 인덱싱을 사용하여 먼저 해당 값 count[y]
(카운트)과 y
키를 인쇄합니다.