ファイルから重複した行を削除し、新しいファイルに一意の行を保存するコマンドがあります。
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
と、コマンドをリダイレクトすると元のファイルが切り捨てられ、そのデータが失われます。cp
uniq
答え2
ファイルを開くと切り捨てられる可能性uniq
があるため、一時ファイルを使用する必要があります。>
この試み、
for f in *.txt; do
tmpf=$(mktemp)
uniq "$f" "$tmpf" && mv "$tmpf" "$f"
done