중복을 피하기 위해 단어 목록에 단어를 추가하려면 sort -u를 사용하세요.

중복을 피하기 위해 단어 목록에 단어를 추가하려면 sort -u를 사용하세요.

중복된 one.txt라는 txt 파일이 2개 있습니다.

yesterday
yesterday
today
today
tomorrow
tomorrow

두 번째 txt는 two.txt라고 하며 중복된 내용을 포함합니다.

mike
mike
paul
paul
tomorrow
tomorrow

이 명령을 사용하면 sort -u one.txt > total.txt출력 파일을 얻을 수 있습니다.

today
tomorrow
yesterday

그래서 다음 sort -u two.txt >> total.txt을 사용하여 동일한 출력 파일에 두 번째 파일을 추가했습니다.

today
tomorrow
yesterday
mike
paul
tomorrow

나는 "내일"이라는 단어를 두 번 사용했습니다. 그것을 피하는 방법?

sed 's/[[:space:]]+$//' one.txt two.txt | sort -u total.txt

해결책처럼 보이지만 다음과 같은 다른 단어 목록을 추가하려고 할 때마다 문제가 발생합니다.

sed 's/[[:space:]]+$//' three.txt | sort -u total.txt

답변1

total.txt정렬된 순서( mike및 로 시작) 로 이동하려면 paul다음 중 하나를 수행할 수 있습니다.

  • sort -u one.txt two.txt > total.txt또는
  • sort -u total.txt two.txt -o total.txt

순서를 유지해야 하는 경우( one.txt먼저 내용을 정렬한 다음 내용을 정렬함)two.txt 와는 별개로) one.txt그런 다음 실행

  • sort -u two.txt | awk '!seen[$0]++' total.txt - > temp.txt; mv temp.txt total.txt

이는 다음과 같습니다.

  • (cat total.txt; sort -u two.txt) | awk '!seen[$0]++' > temp.txt; mv temp.txt total.txt

즉, 획득된 콘텐츠 total.txt (이미 정렬 및 중복 제거됨)와 정렬되고 중복 제거된 콘텐츠가 뒤따르고 two.txt전달됩니다.이전에 녹음된 awk정렬되지 않은 파일을 중복 제거하는 명령입니다.

답변2

sedplus 를 사용하여 sponge입력 파일을 안전하게 덮어 쓸 수 있습니다 . 이를 통해 패키지(Ubuntu)에서 사용 가능한 total입력 파일 로 사용할 수 있습니다 . spongemoreutils

Sponge는 표준 입력을 읽고 이를 지정된 파일에 씁니다. 쉘 리디렉션과 달리 스폰지는 출력 파일을 열기 전에 모든 입력을 흡수합니다. 이를 통해 동일한 파일을 읽고 쓰는 파이프라인을 구축할 수 있습니다.

file[0]=total; [[ -f "$file" ]] || touch "$file"
file[1]=any
file[2]=number 
file[3]=of
file[4]=files
sed 's/[[:space:]]\+$//' "${file[@]}" | sort -u | sponge "$file"

bash var 배열의 첫 번째 항목은 ${file[0]}인덱스를 사용하지 않고 참조되고 해당 값이 설정될 수 있습니다. $file(위에서 했던 것처럼 - 입력하기가 더 쉽습니다). 아직 종료되지 않은 경우 생성됩니다
. 원하는 만큼의 파일을 사용할 수 있습니다. 그에 따라 색인 번호를 늘리면 됩니다. 동일한 파일 세트를 다시 실행할 수 있으며 내용은 (해당 파일 세트에 대해) 첫 번째 실행과 동일하게 유지됩니다.[[ -f total ]] || touch totaltotal

total

대신 sponge임시 파일로 출력한 다음 total해당 임시 파일로 바꿀 수 있습니다(하지만 선호합니다 sponge).

관련 정보