Bash 基于唯一列值获取表的子集

Bash 基于唯一列值获取表的子集,bash,awk,sed,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解决方案 感

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解决方案


感谢使用
排序
awk

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
awk-v ORS='\n\n'!(a中的$1){a[$1]=0;ind[++i]=1;next}
{a[$1]=a[$1]RS$0}

结束{for(k=1;k使用
sort
awk

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
awk-vors='\n\n'!(a中的$1){a[$1]=$0;ind[++i]=$1;next}
{a[$1]=a[$1]RS$0}

END{for(k=1;k我不知道这个
awk
是否有用,但它将根据唯一的列值创建3个单独的文件:

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

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

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

可选的
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

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

可选
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
末尾有两行尾随的空行,但未显示在格式化输出中。

create input list file.txt 创建输入列表文件.txt
不,这不会因为使用关联数组而保持原始顺序。I是指每个块中记录的顺序,而不是块本身。不,这不会因为使用关联数组而保持原始顺序。I是指每个块中记录的顺序,而不是块本身。顺便问一下,您对生成的文件名?即,在每个文件名中添加一个尾随的
.out
?如果您将
awk
设置为这样,请为延迟道歉:
awk'{print>>“out”$1;close($1)}“
文件…它将在每个新文件之前打印出”
,顺便问一下-您对生成的文件名有任何额外的控制吗?例如,在每个文件名中添加一个尾随的
.out
?如果您将
awk
设置为这样,请为延迟道歉:
awk'{print>>“out”$1;close($1)}”“
文件…它将在每个新文件之前打印出”