텍스트 파일에서 중복 된 줄을 계산하는 Linux 명령 또는 스크립트?


116

다음과 같은 내용의 텍스트 파일이있는 경우

red apple
green apple
green apple
orange
orange
orange

다음 결과를 얻기 위해 사용할 수있는 Linux 명령 또는 스크립트가 있습니까?

1 red apple
2 green apple
3 orange

답변:


214

sort(인접한 항목을 모으기 위해) 그것을 통해 보낸 다음 uniq -c카운트를 제공합니다.

sort filename | uniq -c

정렬 된 순서 (빈도 별)로 목록을 가져 오려면

sort filename | uniq -c | sort -nr

48

borribles와 거의 동일하지만 d매개 변수를 추가하면 uniq중복 만 표시됩니다.

sort filename | uniq -cd | sort -nr

1
작은 -d메모에 엄지 손가락 .
sepehr

6

uniq -c file

파일이 아직 정렬되지 않은 경우 :

sort file | uniq -c


3

이 시도

cat myfile.txt| sort| uniq

-c 또는 -d 플래그가 없으면 uniq가 중복 행과 중복되지 않은 행을 구별하지 못합니까? 아니면 뭔가 누락 되었습니까?
drevicko 2015


2

알파벳 순서로 된 목록으로 살 수 있습니까?

echo "red apple
> green apple
> green apple
> orange
> orange
> orange
> " | sort -u 

?

green apple
orange
red apple

또는

sort -u FILE

-u는 고유함을 나타내며 고유성은 정렬을 통해서만 도달합니다.

순서를 유지하는 솔루션 :

echo "red apple
green apple
green apple
orange
orange
orange
" | { old=""; while read line ; do   if [[ $line != $old ]]; then  echo $line;   old=$line; fi ; done }
red apple
green apple
orange

그리고, 파일

cat file | { 
old=""
while read line
do
  if [[ $line != $old ]]
  then
    echo $line
    old=$line
  fi
done }

마지막 두 개는 바로 뒤에 오는 중복 항목 만 제거합니다.

echo "red apple
green apple
lila banana
green apple
" ...

바나나로 분할 된 두 개의 사과를 인쇄합니다.


0

카운트를 얻으려면 :

$> egrep -o '\w+' fruits.txt | sort | uniq -c

      3 apple
      2 green
      1 oragen
      2 orange
      1 red

정렬 된 개수를 얻으려면 :

$> egrep -o '\w+' fruits.txt | sort | uniq -c | sort -nk1
      1 oragen
      1 red
      2 green
      2 orange
      3 apple

편집하다

아하, 이것은 단어 경계를 따르는 것이 아닙니다. 전체 줄에 사용할 명령은 다음과 같습니다.

$> cat fruits.txt | sort | uniq -c | sort -nk1
      1 oragen
      1 red apple
      2 green apple
      2 orange

0

다음은 Counter 유형을 사용하는 간단한 파이썬 스크립트 입니다. 이점은 기본적으로 제로 메모리를 사용하여 파일을 정렬 할 필요가 없다는 것입니다.

import collections
import fileinput
import json

print(json.dumps(collections.Counter(map(str.strip, fileinput.input())), indent=2))

산출:

$ cat filename | python3 script.py
{
  "red apple": 1,
  "green apple": 2,
  "orange": 3
}

또는 간단한 한 줄짜리를 사용할 수 있습니다.

$ cat filename | python3 -c 'print(__import__("json").dumps(__import__("collections").Counter(map(str.strip, __import__("fileinput").input())), indent=2))'
당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.