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

関連情報