根据唯一列值获取表的子集

时间:2016-02-24 21:10:19

标签: bash awk sed

H-我正在寻找一个bash / awk / sed解决方案,以根据唯一列值获取表的子集。例如,如果我有:

chrom1 333
chrom1 343
chrom2 380
chrom2 501
chrom1 342
chrom3 102 

我希望能够将此表拆分为3:

chrom1 333
chrom1 343
chrom1 342


chrom2 380
chrom2 501


chrom3 102

我知道如何使用split命令在R中执行此操作,但我特意寻找bash / awk / sed解决方案。

由于

4 个答案:

答案 0 :(得分:1)

使用sortawk

sort -k1,1 file | awk 'NR>1 && p != $1{print ORS} {p=$1} 1'

编辑:如果您想从输入文件中保留记录的原始顺序,请使用:

awk -v ORS='\n\n' '!($1 in a){a[$1]=$0; ind[++i]=$1; next}
   {a[$1]=a[$1] RS $0}
   END{for(k=1; k<=i; k++) print a[ind[k]]}' file

答案 1 :(得分:1)

我不知道这个awk是否有用,但它会根据唯一的列值创建3个单独的文件:

awk '{print >> $1; close($1)}' file 

答案 2 :(得分:1)

替代awk,它保留每个块中记录的原始顺序

$ awk '{a[$1]=a[$1]?a[$1] ORS $0:$0}
    END{for(k in a) print a[k] ORS ORS}' file

产生

chrom1 333
chrom1 343
chrom1 342


chrom2 380
chrom2 501


chrom3 102

末尾有2个尾随空行,但未在格式化输出中显示。

答案 3 :(得分:0)

创建输入列表file.txt

(
cat << EOF
chrom1 333
chrom1 343
chrom2 380
chrom2 501
chrom1 342
chrom3 102
EOF
) > file.txt

transfomation

cat file.txt  | cut -d" " -f1 | sort -u | while read c
do 
cat file.txt | grep "^$c" | sort
echo
done