如何统计制表符分隔的文本文件中字段的唯一值的数量?

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

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

所以,就像第一列有颜色一样,所以我想知道该列中有多less不同的唯一值,我希望能够为每列做到这一点。

我需要在Linux命令行中这样做,所以可能使用一些bash脚本,sed,awk或其他东西。

附录:感谢大家的帮助,我可以再问一个问题吗? 如果我想要统计这些独特的价值呢?

我想我没有把第二部分弄清楚。 我想要做的就是让这些独特值的“每一个”都不知道有多less独特的值。 例如,在第一列中,我想知道有多less个红色,蓝色,绿色等有色物体。

你可以使用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 

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

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

如其他地方发布的,如果你想统计一些东西的实例,你可以将唯一列表输入到wc -l

 cat test.csv | awk '{ a[$1]++ } END { for (n in a) print n, a[n] } ' 

假设数据文件实际上是Tab分隔的,不是空间对齐的:

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

4美元将是:

  • $ 1 – 红色
  • $ 2 – 球
  • $ 3 – 1
  • $ 4 – 已售出
 # COLUMN is integer column number # INPUT_FILE is input file name cut -f ${COLUMN} < ${INPUT_FILE} | sort -u | wc -l 

这里是一个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 '\t' | 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 

此脚本输出给定文件的每一列中唯一值的数量。 它假定给定文件的第一行是标题行。 没有必要定义数量的字段。 只需将脚本保存在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"\t"item"_"arr[fname[fi]][item]; print(out); } } ' $1 

执行示例:

bash> ./script.sh <path to tab-delimited file>

输出示例

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