每行计算文件中的唯一元素

时间:2012-12-05 11:06:11

标签: linux bash unix

假设我有一个文件,每行有5个元素。

$ cat myfile.txt

e1 e2 e3 e4 e5
e1 e1 e2 e2 e1
e1 e1 e4 e4 e4

对于每一行我想要执行以下命令来计算每一行上的唯一元素。:

tr \\t \\n | sort -u | wc 

我无法弄清楚命令的第一部分 - 有人可以帮助我吗?

免责声明:该文件看起来如下所示 - 但我执行xargs -L 5获取输出,如第一部分所示。

e1
e2
e3
e4
e5 

3 个答案:

答案 0 :(得分:2)

根据您的输入文件:

$ cat file
e1 e2 e3 e4 e5
e1 e1 e2 e2 e1
e1 e1 e4 e4 e4

使用awk的文件中的唯一元素:

awk '{for(i=1;i<=NF;i++) a[$i]} END{for (keys in a) print keys}' 
e1
e2
e3
e4
e5

使用grep代替tr的文件中的唯一元素:

$ grep -Eo '\w+' file | sort -u
e1
e2
e3
e4
e5

文件中每行的唯一元素:

使用awk

$ awk '{for(i=1;i<=NF;i++) a[$i]; print length(a); delete a}' file
5
2
2

awk解决方案真的是这里的方法,但是在你标记它之后使用bash

#!/bin/bash

while read line; do
  echo $line | grep -Eo '\w+' | sort -u | wc -l 
done < file

输出:

5
2
2

答案 1 :(得分:1)

您可以使用:

perl -F -lane '$count{$_}++ for (@F);print scalar values %count;undef %count' your_file

测试如下:

> cat temp
e1 e2 e3 e4 e5
e1 e1 e2 e2 e1
e1 e1 e4 e4 e4
> perl -F -lane '$count{$_}++ for (@F);print scalar values %count;undef %count' temp
5
2
2
>

答案 2 :(得分:1)

如果你想要一个perl,那么这是一个版本:

perl -F'\s' -pane '%H=map{$_=>1}@F; $_=keys(%H)."\n"' myfile.txt