我有一个带有制表符分隔的大量数据的文本文件。 我想看看这些数据,以便我可以看到列中的唯一值。 例如,
Red Ball 1 Sold Blue Bat 5 OnSale ...............
所以,就像第一列有颜色一样,所以我想知道该列中有多less不同的唯一值,我希望能够为每列做到这一点。
我需要在Linux命令行中这样做,所以可能使用一些bash脚本,sed,awk或其他东西。
附录:感谢大家的帮助,我可以再问一个问题吗? 如果我想要统计这些独特的价值呢?
我想我没有把第二部分弄清楚。 我想要做的就是让这些独特值的“每一个”都不知道有多less独特的值。 例如,在第一列中,我想知道有多less个红色,蓝色,绿色等有色物体。
你可以使用cut
, sort
和uniq
命令如下:
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美元将是:
# 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