使用以下数据:
$cat p1.csv
R,3
R,4
S,1
S,2
S,3
R,2
T,4
R,3
ST,4
RST,2
RSTR,4
首先根据第2列进行排序:
$cat p1.csv | sort -t "," -k2
S,1
R,2
RST,2
S,2
R,3
R,3
S,3
R,4
RSTR,4
ST,4
T,4
我想计算第二列的1,2,3和4的数量。有点像$ cat p1.csv | sort -t“,” - k2 | uniq -f2 -c .....可以将uniq应用于一列吗? -f2未正确将uniq应用于正确的字段。输出应该采用第二列中唯一值的第一个实例并计算它们的数量。因此,必须首先在第二列上对数据进行排序。正确的输出看起来像:
1 S,1
3 R,2
3 R,3
4 R,4
建议?
答案 0 :(得分:11)
你的问题不太清楚所以我只是将你的输出反向设计为你的输入(假设输出中有一个拼写错误,因为你提到计算第2列的1,2和3的数字并显示{{1} })。您可能需要更好地解释一下您的问题 -
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.
为了根据列查找唯一条目,您可以尝试使用-u选项进行排序(但它不会为您提供计数)。
来自[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
页面:
man
你可以尝试这样的事情 -
-u, --unique
with -c, check for strict ordering;
without -c, output only the first of an equal run
我不确定Uniq是否可以在由除空格之外的分隔符分隔的列上执行。至少在我的Mac上没有。这是手册页参考
sort -t, -k2 p1.csv | sort -u -t, -k2
因此,如果您可以删除-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
答案 1 :(得分:1)
我刚刚遇到了一个有趣的案例,其中数据集中的重复值很容易解析,我只是想为可能感兴趣的任何人提供案例。
我在数据集中添加了两个添加项(*):
$cat p1.space
R 3
R 4
S 1
S 2
S 3
R 2
T 4
R 3
ST 4
RST 2
RSTR 4
R* 5
R* 5
新值包括重复输入R * 5.在第二列排序,我们看到下面的新值:
$sort -k2 p1.space
S 1
R 2
RST 2
S 2
R 3
R 3
S 3
R 4
RSTR 4
ST 4
T 4
R* 5
R* 5
注意重复项目(R * 5)如何计为两个条目:
$sort -k2 p1.space | uniq -f1 -c
1 S 1
3 R 2
3 R 3
4 R 4
2 R* 5
要保存uniq行的计数,我们必须在计算uniq行数之前统一数据集:
$sort -k2 p1.space | uniq | uniq -f1 -c
1 S 1
3 R 2
2 R 3
4 R 4
1 R* 5
我希望能帮助那些可能有类似计数要求的人。祝好运!谢谢你@Jaypal。