2012-11-14 54 views
1

我实际上是在编写一个批处理脚本,我需要使用批处理代码(这是蹩脚的),uniq,排序,sed等删除重复的行,但它不能排序列表中的过程。有任何想法吗 ?使用uniq命令(排序)

sort <file> | uniq 

工程很好,但它排序我已经排序的文件。任何ides?

cat <file> | uniq 

失败。

回答

2

如果你的文件已经被排序,你可以为你给的,即

猫的例子中使用的uniq命令| uniq

排序不是要求对于uniq,强烈建议,因为它只消除连续重复。如果一条生产线在2,3,4,8行上重复,在管道中没有排序命令,则生产线2和8将在输出中。排序只有第2行将在输出。

希望这是你问

+0

因此它不起作用。 –

+0

你为什么说这不起作用?你说文件已经“排序”,所以你不需要另一个排序命令。 whjne你运行命令“cat file | uniq”输出中的内容告诉你它没有工作?如果您看到一行或多行的倍数,则意味着您的文件不像您想象的那样已被排序*。其他任何失败?你需要提供一个例子 – MelBurslan

1

如果可以使用例如不要太古代版的bash(支持数组变量),你可以很容易地做到这一点在while循环:

#!/bin/bash 
declare -a LINES 
while read; do 
    for n in "${LINES[@]}"; do 
     if [[ $n == $REPLY ]]; then 
      continue 2 
     fi 
    done 
    LINES=("${LINES[@]}" "$REPLY") 
    echo "$REPLY" 
done 

如果你的文件大,AWK或Perl很可能是更好的。

+0

我在批处理文件中使用这个.. –

1

下的Windows/DOS批处理文件做你需要什么(我希望...)

@echo off 
setlocal DisableDelayedExpansion 
for /F "eol=⌂ delims=" %%a in (thefile.txt) do (
    if not defined line["%%a"] (
     set line["%%a"]=defined 
     echo %%a 
    ) 
) 

注意,在eol=⌂部分字符必须是任何字符。该文件中不存在;我建议你使用Ascii-127(如我的代码)或Ascii-255(看起来像一个空间)。

请测试程序并报告结果。

Antonio

+0

我将你的代码完全复制到了我的代码中,而且我越来越......“îédelims =”此时意外。“ –

+0

@MikeQ:这很奇怪,代码在我的Win-XP电脑上工作,没有任何问题......无论如何,归咎于出错后的字符位于'eol ='之后,您可以通过其他字符来修改它,但不会出现在文件中或者如果文件中没有以分号开头的行,请彻底删除'eol = X'选项。请报告结果... – Aacini

+0

我会接受它,我沿着不同的方向前进。 –