2010-08-17 33 views
31

我有一個帶有製表符分隔的大量數據的文本文件。我想查看數據,以便我可以在列中看到唯一值。例如,如何統計製表符分隔文本文件中字段唯一值的數量?

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

所以,它就像第一列的顏色,所以我想知道有多少不同的唯一值在該列在那裏,我希望能夠做到這一點的每一列。

我需要在Linux命令行中這樣做,所以可能使用一些bash腳本,sed,awk或其他東西。

附錄:感謝大家的幫助,我可以再問一件事嗎?如果我想要計算這些獨特的值,該怎麼辦?

我想我沒有把第二部分清楚。我想要做的是計算這些獨特值的「每個」不知道有多少獨特值。例如,在第一列中,我想知道有多少個紅色,藍色,綠色等有色物體。

+5

'uniq -c'每個項目的計數。 – 2010-08-17 13:15:53

+0

@丹尼斯謝謝,這是我需要的。我真的很喜歡Linux命令行的強大而簡單。需要開始正確學習:)。 – sfactor 2010-08-17 13:38:02

回答

65

您可以使用cutsortuniq命令如下:

cat input_file | cut -f 1 | sort | uniq 

得到在場1中唯一值,由2置換1-會給你在現場唯一值2

避免UUOC :)

cut -f 1 input_file | sort | uniq 

編輯:

要算你可以使用wc指揮鏈中的獨特OCCURENCES數量:

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

你也可以使用'sort -u'而不是'sort | uniq' – Hasturkun 2010-08-17 12:42:33

+18

'uniq -c'會給每個項目計數 - 'wc -l'會計算項目總數。 – 2010-08-17 13:14:56

+2

+1謝謝@codaddict等人。 'uniq -c'是我需要的最後一個位... – hafichuk 2011-11-18 21:13:35

8

您可以用awk,排序&的uniq要做到這一點,例如列表中的所有獨特在第一列中的值

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

與其他地方一樣貼,如果你要計算的東西,你可以管的唯一列表實例的數量爲wc -l

2

假設數據文件實際上是製表符分隔,不佔空間排列:

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

其中$ 4將於:

  • $ 1 - 紅
  • $ 2 - 球
  • $ 3 - 1
  • $ 4 - 出售
2
# COLUMN is integer column number 
# INPUT_FILE is input file name 

cut -f ${COLUMN} < ${INPUT_FILE} | sort -u | wc -l 
5
cat test.csv | awk '{ a[$1]++ } END { for (n in a) print n, a[n] } ' 
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 
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 
相關問題