用于特定删除目的的完整选项命令语法如何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);