【问题标题】:How to count number of unique values of a field in a tab-delimited text file?如何计算制表符分隔文本文件中字段的唯一值数?
【发布时间】:2020-12-15 20:10:44
【问题描述】:

我有一个文本文件,其中包含大量以制表符分隔的数据。我想查看数据,以便可以看到列中的唯一值。例如,

Red     Ball 1 Sold
Blue    Bat  5 OnSale
............... 

因此,就像第一列有颜色一样,所以我想知道该列中有多少个不同的唯一值,并且我希望能够为每一列执行此操作。

我需要在 Linux 命令行中执行此操作,因此可能使用一些 bash 脚本、sed、awk 或其他东西。

如果我也想计算这些唯一值怎么办?

更新:我想我没有把第二部分说得足够清楚。我想做的是对这些唯一值中的“每个”进行计数,但不知道那里有多少个唯一值。例如,在第一列中,我想知道有多少红色、蓝色、绿色等颜色的对象。

【问题讨论】:

    标签: linux bash command-line


    【解决方案1】:

    您可以使用 cutsortuniq 命令,如下所示:

    cat input_file | cut -f 1 | sort | uniq
    

    获取字段 1 中的唯一值,将 1 替换为 2 将为您提供字段 2 中的唯一值。

    避免UUOC:)

    cut -f 1 input_file | sort | uniq
    

    编辑:

    要计算唯一出现的次数,您可以在链中使用 wc 命令,如下所示:

    cut -f 1 input_file | sort | uniq | wc -l
    

    【讨论】:

    • uniq -c 将给出每个项目的计数 - wc -l 将计算项目的总数。
    【解决方案2】:
    awk -F '	' '{ a[$1]++ } END { for (n in a) print n, a[n] } ' test.csv
    

    【讨论】:

      【解决方案3】:

      您可以使用 awk、sort 和 uniq 来执行此操作,例如列出第一列中的所有唯一值

      awk < test.txt '{print $1}' | sort | uniq
      

      正如在其他地方发布的那样,如果你想计算某物的实例数量,你可以将唯一列表通过管道传输到wc -l

      【讨论】:

        【解决方案4】:

        假设数据文件实际上是制表符分隔的,而不是空格对齐的:

        <test.tsv awk '{print $4}' | sort | uniq
        

        $4 在哪里:

        • $1 - 红色
        • $2 - 球
        • $3 - 1
        • 4 美元 - 已售出

        【讨论】:

          【解决方案5】:
          # COLUMN is integer column number
          # INPUT_FILE is input file name
          
          cut -f ${COLUMN} < ${INPUT_FILE} | sort -u | wc -l
          

          【讨论】:

            【解决方案6】:

            这是一个 bash 脚本,可以完全回答(修订后的)原始问题。也就是说,给定任何 .tsv 文件,它依次提供每一列的概要。除了 bash 本身,它只使用标准的 *ix/Mac 工具:sed tr wc cut sort uniq。

            #!/bin/bash
            # Syntax: $0 filename   
            # The input is assumed to be a .tsv file
            
            FILE="$1"
            
            cols=$(sed -n 1p $FILE | tr -cd '	' | wc -c)
            cols=$((cols + 2 ))
            i=0
            for ((i=1; i < $cols; i++))
            do
              echo Column $i ::
              cut -f $i < "$FILE" | sort | uniq -c
              echo
            done
            

            【讨论】:

              【解决方案7】:

              此脚本输出给定文件的每一列中唯一值的数量。它假定给定文件的第一行是标题行。无需定义字段数。只需将脚本保存在 bash 文件 (.sh) 中,并提供制表符分隔文件作为此脚本的参数。

              代码

              #!/bin/bash
              
              awk '
              (NR==1){
                  for(fi=1; fi<=NF; fi++)
                      fname[fi]=$fi;
              } 
              (NR!=1){
                  for(fi=1; fi<=NF; fi++) 
                      arr[fname[fi]][$fi]++;
              } 
              END{
                  for(fi=1; fi<=NF; fi++){
                      out=fname[fi];
                      for (item in arr[fname[fi]])
                          out=out"	"item"_"arr[fname[fi]][item];
                      print(out);
                  }
              }
              ' $1
              

              执行示例:

              bash&gt; ./script.sh &lt;path to tab-delimited file&gt;

              输出示例

              isRef    A_15      C_42     G_24     T_18
              isCar    YEA_10    NO_40    NA_50
              isTv     FALSE_33  TRUE_66
              

              【讨论】:

                猜你喜欢
                • 2012-05-14
                • 2021-03-21
                • 2012-04-08
                • 1970-01-01
                • 2015-07-16
                • 2017-03-17
                • 2015-12-17
                • 1970-01-01
                • 2013-07-23
                相关资源
                最近更新 更多