입력 파일
1 2 3 1 4 5 6 1 1 2 34 5 6 2
제 생각에는산출이와 같이
1 2 3 4 5 6 34
(반복되는 숫자는 모두 한 번만 인쇄됩니다)
답변1
답변2
노트: 이 솔루션은 결과를 원래 순서대로 유지합니다!
awk
이는 및 를 사용하여 쉽게 수행할 수 있습니다 tr
. 콘텐츠가 파일에 있는 경우 FILE
:
$ tr ' ' '\n' < FILE | awk '!x[$0]++' | tr '\n' ' '
예
$ echo "1 2 3 1 4 5 6 1 1 2 34 5 6 2" | \
tr ' ' '\n' | awk '!x[$0]++' | tr '\n' ' '
1 2 3 4 5 6 34
어떻게 작동하나요?
tr ' ' '\n'
- 공백을 개행 문자로 전환awk '!x[$0]++'
- 독특한 캐릭터를 인쇄하세요tr '\n' ' '
- 스위치 줄이 공백으로 다시 바꿈
답변3
그리고 awk
(전체 파일에서 중복 항목 제거):
awk '{ SEP=""; i=0;
while (++i<=NF) { printf (!unq[$i]++? SEP $i:""); SEP=" "};
print "";
}' infile
또는 각 행에서 중복 항목을 개별적으로 제거:
awk '{ SEP=""; i=0; delete unq;
while (++i<=NF) { printf (!unq[$i]++? SEP $i:""); SEP=" "};
print "";
}' infile
숫자를 반복하고 이전에 본 적이 없는 경우 호출 배열에 추가하고 unq
그렇지 printf
않으면 아무것도 인쇄하지 않습니다.
앞으로 읽을 내용:
답변4
를 사용하여 이 작업을 수행할 수 있습니다 sort
. 정렬은 줄에서만 작동하므로 파일의 공백을 새 줄로 바꿔야 합니다.
예를 들어, 파일에 다음이 test.txt
포함되어 있는 경우:
1 2 3 1 4 5 6 1 1 2 34 5 6 2
아래 코드는 원하는 것을 반환합니다
>sed "s/ /\n/g" test.txt | sort -un
1
2
3
4
5
6
34
는 "고유"(중복되지 않는 값)를 반환하지만 sort -u
숫자 정렬을 사용하지 않는 한 사전순으로 정렬됩니다 sort -n
. 여기서는 연속된 중복만 제거하기 때문에 정렬이 필요하므로 uniq
어쨌든 파이프를 해야 합니다.sort -n | uniq
sort