可以排序| uniq或sort | awk从一列重复计算值?

时间:2013-05-23 22:33:31

标签: sorting awk uniq

使用以下数据:

$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

建议?

2 个答案:

答案 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选项

排序

为了根据列查找唯一条目,您可以尝试使用-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

我不确定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。