파일로 리디렉션하기 전에 중복 항목을 제거하는 방법

파일로 리디렉션하기 전에 중복 항목을 제거하는 방법

파일에서 중복된 항목을 제거하는 "uniq" 명령을 보았지만 파일을 저장하기 전에 중복된 출력을 제거하려는 의도입니다.

#!/bin/sh
echo "aaa"
echo "bbb"
echo "aaa"
echo "aaa"
echo "bbb"
echo "ccc"

내가 원하는 출력은

aaa
bbb
ccc

그런 다음 텍스트 파일로 리디렉션

괜찮나요? 감사해요.

답변1

uniq정렬된 입력에만 적용됩니다.

./my_script.sh | sort -u > output_file

본질적으로 동일

./my_script.sh | sort | uniq > output_file

답변2

awk '!a[$0]++'정렬되지 않은 중복 행을 제거하고 원래 순서를 유지하는 간단한 방법입니다.

이를 사용하여 예를 들어 다음과 같은 작업을 수행할 수 있습니다.

  • 필터 출력:./my_script |awk '!a[$0]++' > output
  • 필터 스크립트:awk '!a[$0]++' my_script > new_script
  • 스크립트를 필터링하고 실행합니다.awk '!a[$0]++' my_script | sh > output
  • vim 내 필터::%!awk '\!a[$0]++'

그 뒤에 있는 아이디어는 발생 횟수를 배열에 저장하여 발견된 패턴을 추적하고 a해당 특정 내용(in으로 표시됨)의 값이 여전히 0인 경우에만 해당 행을 인쇄하는 것입니다. 그래서,a$0awk

  • a[$0]++$0"인덱스"(= 현재 입력 줄의 내용)의 배열 항목을 1만큼 늘립니다.
  • !a[$0]awk내용의 배열 항목이 여전히 0인 경우에만 행을 인쇄하도록 지시하는 필터 규칙입니다 (초기화되지 않은 경우 암시적으로 발생함).
  • !a[$0]++두 개를 한 줄로 결합(일명 "코드 골프")

...bash를 사용하여 더 읽기 쉽게 만들 수도 있습니다 alias.

alias myuniq='awk '\''!a[$0]++'\'


\감사합니다{@AdminBee}

관련 정보