중복된 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
sed
plus 를 사용하여 sponge
입력 파일을 안전하게 덮어 쓸 수 있습니다 . 이를 통해 패키지(Ubuntu)에서 사용 가능한 total
입력 파일 로 사용할 수 있습니다 . sponge
moreutils
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 total
total
total
대신 sponge
임시 파일로 출력한 다음 total
해당 임시 파일로 바꿀 수 있습니다(하지만 선호합니다 sponge
).