在BASH中重复数据删除文件

时间:2009-10-07 09:53:04

标签: bash sorting file-io

我有一套,哦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

4 个答案:

答案 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