我有一个包含大量数据的文本文件,这是以制表符分隔的。我想查看数据,以便我可以在列中看到唯一值。例如,
Red Ball 1 Sold
Blue Bat 5 OnSale
...............
所以,它就像第一列有颜色一样,所以我想知道该列中有多少不同的唯一值,我希望能够为每一列做到这一点。
我需要在Linux命令行中执行此操作,因此可能使用一些bash脚本,sed,awk或其他东西。
附录:感谢大家的帮助,我可以再问一件事吗?如果我想要计算这些独特的值,该怎么办?
我想我没有清楚地说明第二部分。我想要做的是计算这些唯一值的“每个”,不知道有多少独特的值。例如,在第一栏中,我想知道有多少红色,蓝色,绿色等彩色物体。
答案 0 :(得分:70)
您可以按如下方式使用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
答案 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将是:
答案 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