2

使用以下数据:

$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 | 排序 -t "," -k2 | uniq -f2 -c .....uniq 可以应用于一列吗?-f2 没有正确地将 uniq 应用于正确的字段。输出应采用第二列中唯一值的第一个实例并计算它们的数量。因此,数据必须首先按第二列排序。正确的输出如下所示:

1 S,1
3 R,2
3 R,3
4 R,4

建议?

4

2 回答 2

11

你的问题不是很清楚,所以我只是将你的输出逆向工程到你的输入(假设你的输出中有错字,因为你提到从第 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
于 2013-05-23T23:24:21.243 回答
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 行数之前对数据集进行 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。

于 2013-05-26T20:46:20.727 回答