用于特定删除目的的完整 sort -u 选项命令

用于特定删除目的的完整 sort -u 选项命令

用于特定删除目的的完整选项命令语法如何sort -u删除任何不是 100% 精确的重复行,而不是在行中查找精确的字符,每个单词之间存在空格的行其长度可能会有所不同,因此被视为要删除的重复行?

答案1

perl -ae 'print unless $seen{"@F"}++' < file

如果以前见过用空格连接的F字段(@F在wk 模式下),则不会打印一行。如果您还希望对输出进行排序,请a通过管道连接到。sort

在这种情况下,字段由 ASCII 空白字符分隔(空格、水平制表符、换行符、回车符、换页符以及自 5.18 起垂直制表符,与isspace()C 语言环境中的 POSIX 匹配的相同)。


¹ 双引号内的元素@list使用特殊变量的值连接$",默认情况下是一个空格,所以"@F"就像join(" ", @F).

答案2

sort本身并不能做你想做的事。您的规范有点模糊,但一般方法是您对输入进行规范化(例如,删除每行末尾和开头的所有空格,使用 将多个连续空格替换为单个空格tr --squeeze-repeats ' ' ' '),然后对结果进行排序。

通常的管道操作使这变得容易;您可以将所有这些合并到一个sed命令中,但假设您的数据并不大(用计算机术语来说),因为您正在应用sort它:

input_command | sed 's/^ *//' | sed 's/ *$//' | tr --squeeze-repeats ' ' ' ' | sort -u

请注意,您获得的输出不一定对应于实际的输入行 - 例如,

 d c b a
a  b c d
a b  c d

是你的输入,那么输出就是

a b c d
d c b a

这两行都不存在确切地 在输入中,但它们是来自与输入中的行相同的等效类的代表。

如果您需要重现实际的输入行,shell 编程可能只需要 Python 四行代码的一半,或者其他具有关联数组的语言(dict在 Python 中)会需要您。

事实上,Pythondict在这里甚至不是一个优雅的选择,因为你无法指定迭代顺序,Python 3.7+ 保证它是插入顺序,这太糟糕了;dict只是方便使用。

std::set<std::string, [](const auto &a , const auto& b){ return normalize(a) > normalize(b); }> unique_lines;具有您自己的标准化函数的C++类型normalize会更好,因为您最终可以

std::set<std::string,
         [](const auto &a, const auto &b) {
           return normalize(a) > normalize(b);
         }>
    lineset;
std::ifstream in_file("yourinputfile.txt");
std::copy(std::istream_iterator<std::string>(in_file),
          std::istream_iterator<std::string>(),
          std::inserter(lineset, lineset.end()));
for (const auto &unified_line : lineset)
  std::cout << std::format("{}\n", unified_line);

相关内容