bash는 폴더의 txt 파일에서 중복 줄을 제거합니다.

bash는 폴더의 txt 파일에서 중복 줄을 제거합니다.

파일에서 중복된 줄을 제거하고 새 파일에 고유한 줄을 저장하는 명령이 있습니다.

uniq telphone.txt output.txt

.txt그런데 현재 폴더의 모든 파일을 검사하여 중복된 파일을 제거하고 동일한 파일 이름으로 저장하는 명령을 찾으려고 합니다.

telphone.txt중복 항목을 제거하고 다른 이름으로 저장 합니다 telphone.txt.

그런 다음 새 파일이 있으면 homes.txt동일한 작업을 수행하고 homes.txt.

가능합니까?

답변1

#!/bin/sh

tmpfile=$(mktemp)

for file in ./*.txt; do
    cp "$file" "$tmpfile" &&
    uniq "$tmpfile" >$file"
done

rm "$tmpfile"

그러면 현재 디렉터리로 끝나는 모든 이름을 반복 .txt하고 각 이름에서 중복된 줄을 차례로 제거합니다.

파일은 먼저 임시 파일에 복사된 다음 을 사용하여 uniq원본 파일 이름으로 출력됩니다.

이렇게 하면 원본 파일의 권한이 변경되지 않습니다(뒤에 가 오면 가 될 수 있음 uniq "$file" >"$tmpfile") cp "$tmpfile" "$file".

또한 호출의 성공 여부에 따라 달라집니다 uniq. 실패 cp하면 명령을 리디렉션하면 원본 파일이 잘리고 해당 데이터가 손실됩니다.cpuniq

답변2

파일을 열 때 잘릴 uniq수 있으므로 임시 파일을 사용해야 합니다 .>

이 시도,

for f in *.txt; do
    tmpf=$(mktemp)
    uniq "$f" "$tmpf" && mv "$tmpf" "$f"
done

관련 정보