我有一套,哦8000左右的文件,我需要重复数据删除。这些文件基本上是由退货分隔的数字列表:
nnnn
nnnnn
nnnn
我想对文件中的数字进行排序和重复删除。我可以使用sort |手动完成此操作uniq或sort -u但我实际上想要覆盖文件。有没有办法在不使用临时文件的情况下执行此操作?我应该使用什么语法来避免“模糊重定向”错误! : - )
#!/usr/bin/env bash
cd /Users/dd/Desktop/images
TEMP="/tmp/$(basename $0).$RANDOM.txt"
for FILENAME in "`find . -name *version_ids.txt -print`"
do
cat $FILENAME | sort -u > $TEMP
$TEMP > $FILENAME
done
(我试过以下,没有给出错误,但似乎没有达到预期的效果......
#!/usr/bin/env bash
cd /Users/dd/Desktop/images
for FILENAME in "`find . -name *version_ids.txt -print`"
do
sort -u $FILENAME -o $FILENAME
done
)
答案 0 :(得分:3)
GNU sort可以编辑文件:
sort -u -o $FILENAME $FILENAME
答案 1 :(得分:1)
尝试
#!/usr/bin/env bash
cd /Users/dd/Desktop/images
for FILENAME in $(find . -name *version_ids.txt -print)
do
sort -u "$FILENAME" > "$FILENAME.tmp"
mv "$FILENAME" "$FILENAME.bak" && mv "$FILENAME.tmp" "$FILENAME"
done
请注意,对于有问题的文件名(包含空格或换行符的文件名),此脚本仍然不安全。
答案 2 :(得分:1)
我经常遇到的类似问题是重复数据删除,但没有排序(保持第一次点击):
perl -ne '$seen{$_}++ or print' in > out
或就地:
perl -i -ne '$seen{$_}++ or print' inout
这可能是一些访客作为主题不说排序。
答案 3 :(得分:0)
您不能$TEMP > $FILENAME
#!/usr/bin/env bash
cd /Users/dd/Desktop/images
TEMP="/tmp/$(basename $0).$RANDOM.txt"
for FILENAME in $(find . -name *version_ids.txt -print)
do
<"$FILENAME" sort -u >"$TEMP"
cat "$TEMP" >"$FILENAME"
done