使用uniq命令而不排序(排序)

时间:2012-11-14 21:26:50

标签: batch-file

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

    sort <file> | uniq   

效果很好,但它对我已经排序的文件进行排序。任何想法?

    cat <file> | uniq

失败。

3 个答案:

答案 0 :(得分:2)

如果您的文件已经排序,您可以使用uniq命令,例如,

猫| uniq的

对于uniq,

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

希望这就是你所要求的

答案 1 :(得分: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可能会更好。

答案 2 :(得分: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(看起来像个空格)。

请测试程序并报告结果。

安东尼奥