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

时间:2010-08-17 12:06:51

标签: linux bash command-line

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

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

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

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

附录:感谢大家的帮助,我可以再问一件事吗?如果我想要计算这些独特的值,该怎么办?

我想我没有清楚地说明第二部分。我想要做的是计算这些唯一值的“每个”,不知道有多少独特的值。例如,在第一栏中,我想知道有多少红色,蓝色,绿色等彩色物体。

7 个答案:

答案 0 :(得分:70)

您可以按如下方式使用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

答案 1 :(得分:8)

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

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

如在其他地方发布的那样,如果您想计算某些内容的实例数,可以将唯一列表导入wc -l

答案 2 :(得分:7)

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

答案 3 :(得分:2)

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

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

$ 4将是:

  • $ 1 - 红色
  • $ 2 - Ball
  • $ 3 - 1
  • $ 4 - 已售出

答案 4 :(得分:2)

# COLUMN is integer column number
# INPUT_FILE is input file name

cut -f ${COLUMN} < ${INPUT_FILE} | sort -u | wc -l

答案 5 :(得分:0)

这是一个完整回答(修订版)原始问题的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

答案 6 :(得分:0)

此脚本输出给定文件的每列中的唯一值的数量。它假定给定文件的第一行是标题行。无需定义字段数。只需将脚本保存在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