【问题标题】:Using sort | awk on one column from a csv?使用排序 | awk 来自 csv 的一列?
【发布时间】:2013-05-19 05:14:58
【问题描述】:

使用 p.txt:

$cat p.txt
R 3
R 4
S 1
S 2
R 1
T 1
R 3

以下命令根据第二列排序:

$cat p.txt | sort -k2
R 1
S 1
T 1
S 2
R 3
R 3
R 4

以下命令删除第二列中的重复值:

$cat p.txt | sort -k2 | awk '!x[$2]++'
R 1
S 2
R 3
R 4

现在为 sapce 插入一个逗号,我们有以下文件:

$cat p1.csv
R,3
R,4
S,1
S,2
R,1
T,1
R,3

以下命令仍然基于第二列排序:

$cat p1.csv | sort -t "," -k2
R,1
S,1
T,1
S,2
R,3
R,3
R,4

以下不是正确的输出:

$cat p1.csv | sort -t "," -k2 | awk '!x[$2]++'
R,1

正确的输出:

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

有什么建议吗?

【问题讨论】:

    标签: sorting awk cat


    【解决方案1】:

    在最后一个命令中尝试awk -F,。所以:

    cat p1.csv | sort -t "," -k2 | awk -F, '!x[$2]++'
    

    由于您的字段由逗号分隔,您需要告诉 awk 字段分隔符不再是空格,而是逗号。 awk 的 -F 选项可以做到这一点。

    【讨论】:

    • 很好地指出了这个问题,但是这个问题不需要 cat 和 awk
    【解决方案2】:

    您需要为awk提供字段分隔符

     cat p1.csv | sort -t "," -k2 | awk -F, '!x[$2]++'
    

    【讨论】:

      【解决方案3】:

      好吧,你不需要所有这些东西,sortuniq 足以做这些事情

      sort -t "," -k2 p1.csv | uniq -s 2
      

      uniq -s 2 告诉 uniq 跳过前 2 个字符(即直到 ,

      【讨论】:

      • 非常感谢!我一直在试图弄清楚如何计算第二列中的重复值。你的帖子使它成为可能:cat p1.csv |排序 -t "," -k2 | uniq -s2 -c
      • @absu:有没有办法将 uniq 用于字段而不是字符?如果第一列的字符长度不同,那么 uniq -s# 中的 # 需要变化。
      • 实际上,我看到uniq -f 让您可以灵活地提及要跳过的字段数量,但我看不到任何选项可以提及, 作为字段分隔符,也许是@987654328 @ 需要更改或 sort -t "," -k2 p1.csv | tr ',' ' '|uniq -f 1 |tr ' ' ',' 但我认为正如 Kent 指出的那样,sort 已经有一个 -u,所以也应该注意 :)
      【解决方案4】:

      好吧,您已经使用了 sort,那么您根本不需要 awk。排序有-u

      也不需要cat

      sort -t, -k2 -u p1.csv 
      

      应该给你预期的输出。

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2015-11-25
        • 2016-02-05
        • 1970-01-01
        • 1970-01-01
        • 2011-07-15
        • 1970-01-01
        相关资源
        最近更新 更多