使用 unix 命令获取每一行的唯一值

bis*_*n72 0 sort uniq

我有一个列表如下:

1 2 5 2
1 5 5 3
1 5 5 5
5 2 2 2
2 2 4 3
Run Code Online (Sandbox Code Playgroud)

我想对每一行进行排序并获得如下唯一值,类似于sort | uniq

1 2 5
1 3 5
1 5
2 5
2 3 4
Run Code Online (Sandbox Code Playgroud)

我一直在网上寻找解决方案,但我只能找到按列排序的解决方案。我怎样才能得到输出?提前致谢。

fra*_*san 5

由于分选的行比连续排序的列更容易,一种方法可以是转置的每一行(使得每个字段变为线),应用sortuniq然后traspose回来。

这是一个简单的实现,假设使用 GNU 工具:

$ while read -r line; do echo "$line" | grep -o '[^ ]*' | sort -h | uniq | paste -s; done <file
Run Code Online (Sandbox Code Playgroud)

它循环遍历file和,对于每一行:

  • grep使用-o选项(仅打印每行的匹配部分)将其输入分成n行,每个匹配的子字符串一行。在这里,我们匹配除空格之外的所有内容。
  • 分割线使用-h选项排序,该选项比较人类可读的数字(如果要将字段排序为字母数字字符串,请删除-h)。
  • uniq命令删除重复项。
  • paste -s将标准输入中的每一行打印为由制表符分隔的单行字段。您可以附加一个 final| tr '\t' ' '将制表符更改为空格。

但是请注意,使用循环处理文本通常被认为是不好的做法