파일에서 중복된 항목을 제거하는 "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
$0
awk
a[$0]++
$0
"인덱스"(= 현재 입력 줄의 내용)의 배열 항목을 1만큼 늘립니다.!a[$0]
awk
내용의 배열 항목이 여전히 0인 경우에만 행을 인쇄하도록 지시하는 필터 규칙입니다 (초기화되지 않은 경우 암시적으로 발생함).!a[$0]++
두 개를 한 줄로 결합(일명 "코드 골프")
...bash를 사용하여 더 읽기 쉽게 만들 수도 있습니다 alias
.
alias myuniq='awk '\''!a[$0]++'\'
\감사합니다{@AdminBee}