uniq -c 명령이 왜 처음에 공백을 넣었습니까?


11

쉘 스크립트 에이 코드가 있습니다.

sort input | uniq -c | sort -nr > output

입력 파일에는 선행 공백이 없지만 출력에는 공백이 있습니다. 이 문제를 어떻게 해결합니까? 이것은 bash에 있습니다.

답변:


13

uniq 의 기본 동작은 7 칸 너비의 줄에서 빈도를 오른쪽으로 조정 한 다음 하나의 공백으로 항목과 빈도를 구분하는 것입니다.

출처 : https://www.thelinuxrain.com/articles/tweaking-uniq-c

sed로 선행 공백을 제거하십시오.

$ sort input | uniq -c | sort -nr | sed 's/^\s*//' > output

2
7 칸 (일명 "탭보다 작음").
chrylis

그런 다음 perl -pe 's/ *(\d+) /$1\t/'( 여기 다른 대안 ) 과 같은 탭으로 분리 할 수 ​​있습니다 . 또한 xclip -selection c스프레드 시트에 직접 붙여 넣기 위해 클립 보드로 파이프합니다 .
Pablo Bianchi

5

uniq -c선행 공백을 추가합니다. 예 :

$ echo test
test
$ echo test | uniq -c
      1 test

파이프 라인 끝에 명령을 추가하여 제거 할 수 있습니다. 예 :

$ echo test | uniq -c | sed 's/^\s*//'
1 test

1

더 많은 유연성을 위해 다른 정렬 도구를 사용할 수 있습니다. 파이썬은 그러한 도구 중 하나입니다.

출처

#!/usr/bin/python3
import sys, operator, collections

counter = collections.Counter(map(operator.methodcaller('rstrip', '\n'), sys.stdin))
for item, count in counter.most_common():
    print(count, item)

이론적으로 이것은 sort위의 프로그램이 정렬 된 목록 대신 중복 행을 식별하기 위해 해시 테이블을 사용하기 때문에 큰 입력 의 도구 보다 훨씬 빠릅니다 . (아마도 동일한 순서의 줄을 자연스러운 순서 대신 임의의 순서로 배치합니다.이 수정은 여전히 ​​두 번의 sort호출 보다 빠릅니다 .)

출력 형식

당신이 출력 형식에 더 많은 유연성을 원하는 경우에 당신은에 볼 수 print()format()내장 함수.

예를 들어, 최대 7 개의 선행 0과 함께 8 진수로 숫자를 인쇄하고 NUL 줄 종결자가있는 공백 문자 대신 탭을 표시하려면 마지막 줄을 다음으로 바꿉니다.

    print(format(count, '08o'), item, sep='\t', end='\0')

용법

스크립트를 파일에 저장하고이라고 말한 sort_count.py다음 Python으로 호출하십시오.

python3 sort_count.py < input

0
uniq -c -i | tr -s ' ' | cut -c 2-

tr -s를 사용하여 선행 공백을 단일 공백으로 변환 한 다음 cut -c를 사용하여 두 번째 문자의 출력을 인쇄하십시오.


귀하의 솔루션은 공백 순서의 모든 발생을 압박합니다. 이것이 원하는 효과입니다.
마크 반 후미 센
당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.