如何在不排序的情况下使用 Sed 删除重复行?

How do I remove duplicate lines using Sed without sorting?

我一直在尝试找出如何仅使用 Sed 删除重复行,但我在弄清楚如何做时遇到了麻烦。

到目前为止,我已经试过了,但没有奏效。

sed '$!N; /^\(.*\)\n$/!P; D'

文件:

APPLE

ORANGES

BANANA

BANANA

COOKIES

FRUITS

我得到的:

APPLE

ORANGES

BANANA

BANANA

COOKIES

FRUITS

我想要的:

APPLE

ORANGES

BANANA

COOKIES

FRUITS

我一直在想办法做到这一点,这样我就不必手动遍历文件中的每一行并告诉它手动删除重复项。

我的目标是最终删除 BANANA 的第二个实例。

谁能指出我正确的方向?

谢谢

嗯,这很奇怪,这似乎对我有用。是因为每个 text-line 之间有一个空行吗?

~$ cat test.txt
APPLES
ORANAGES
BANANA
BANANA
COOKIES
FRUITS

~$ cat test.txt |  sed '$!N; /^\(.*\)\n$/!P; D'
APPLES
ORANAGES
BANANA
COOKIES
FRUITS

使用sed

$ sed -n '/^$/d;G;/^\(.*\n\).*\n$/d;H;P;a\ ' input_file
APPLE

ORANGES

BANANA

COOKIES

FRUITS

删除空行。追加保留 space。如果该行重复,则将其删除,否则复制到 hold space,打印并插入空行。

这可能对你有用 (GNU sed):

   sed -E '1s/^/\n/;:a;N;s/((\n\S+)(\n\S+)*)\n$//;$!ba;s/.//' file

在第一行,为正则表达式插入一个换行符。

收集模式 space 中的行,添加时删除重复项(预先加上空行)。

在文件末尾,删除引入的换行符并打印结果。