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



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

    sort <file> | uniq   

效果很好,但它对我已经排序的文件进行了排序。 有没有 ?

    cat <file> | uniq

失败。

如果你的文件已经排序,你可以使用 uniq 命令,就像你给出的例子一样,即

猫 | 优Q

排序不是Uniq的要求,强烈建议这样做,因为它只会消除连续的重复项。 如果一行在行号 2、3、4、8 上重复,管道中没有排序命令,则第 2 行和第 8 行将在输出中。使用排序时,输出中只有第 2 行。

希望这就是你要问的

下面的

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(看起来像一个空格)。

请测试程序并报告结果。

安东尼奥

如果你可以使用例如不太古老的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可能会更好。

最新更新