你的问题不是很清楚,所以我只是将你的输出逆向工程到你的输入(假设你的输出中有错字,因为你提到从第 2 列和 show 中计算 1、2 和 3 的数量2 R,2
)。您可能需要更好地解释您的问题-
sort -t "," -k2 < p1.csv |
awk -F, '!z[$2]++{ a[$2]=$0; } END {for (i in a) print z[i], a[i]}' |
sort -k1
解释:
- !z[$2]++ removes the duplicates based on column 2 as awk progresses thru
each line.
- a[$2]=$0 stores the non-duplicates lines in an array
- END {..} looks at all the keys in array and pulls up values. For array a
it pulls up the first line it sees with unique column 2 (as your desired
output). For array z it pulls up number of lines seen with same column 2.
测试:
[jaypal:~/temp] cat file
R,3
R,4
S,1
S,2
S,3
R,2
T,4
R,3
ST,4
RST,2
RSTR,4
[jaypal:~/temp] sort -t "," -k2 < t |
awk -F, '!z[$2]++{ a[$2]=$0; } END {for (i in a) print z[i], a[i]}' |
sort -k1
1 S,1
3 R,2
3 R,3
4 R,4
使用 -u 选项排序
要根据列查找唯一条目,您可以尝试使用 -u 选项进行排序(但它不会给您计数)。
从man
页面:
-u, --unique
with -c, check for strict ordering;
without -c, output only the first of an equal run
你可以试试这样的 -
sort -t, -k2 p1.csv | sort -u -t, -k2
使用 Uniq
我不确定 Uniq 是否可以在由空格以外的分隔符分隔的列上执行。至少在我的mac上没有。这是手册页参考
-f num Ignore the first num fields in each input line when doing comparisons.
A field is a string of non-blank characters separated
from adjacent fields by blanks. Field numbers are one based,
i.e., the first field is field one.
因此,如果您可以删除,
分隔符并运行以下命令,您应该会得到您想要的结果。
sort -k2 test | uniq -c -f1
测试:
[jaypal:~/temp] cat test
R 3
R 4
S 1
S 2
S 3
R 2
T 4
R 3
ST 4
RST 2
RSTR 4
[jaypal:~/temp] sort -k2 test | uniq -c -f1
1 S 1
3 R 2
3 R 3
4 R 4