假设我有一个文件,每行有 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
给定您的输入文件:
$ 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
你可以使用这个:
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
>
perl
如果您喜欢,这里有一个版本:
perl -F'\s' -pane '%H=map{$_=>1}@F; $_=keys(%H)."\n"' myfile.txt