행에서 중복된 숫자를 제거하는 방법은 무엇입니까? [폐쇄]

행에서 중복된 숫자를 제거하는 방법은 무엇입니까? [폐쇄]

입력 파일

1 2 3 1 4 5 6 1 1 2 34 5 6 2

제 생각에는산출이와 같이

1 2 3 4 5 6 34 

(반복되는 숫자는 모두 한 번만 인쇄됩니다)

답변1

Perl이 구출하러 옵니다!

perl -lane 'print join " ", grep ! $seen{$_}++, @F' < file
  • -l입력에서 개행 문자를 제거하고 출력에 추가합니다.
  • -n입력을 한 줄씩 처리
  • -a공백의 각 입력을 @F 배열로 분할

@F 배열은 다음을 통해 반복됩니다.grep, 처음으로 본 요소만 유지합니다(즉, 0의 부정이 참이므로 %seen 해시의 해당 값은 0입니다).가입하다그냥 다시 붙이세요.

답변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 | uniqsort

관련 정보