Bash 基于唯一列值获取表的子集
H-我正在寻找一个bash/awk/sed解决方案,以基于唯一列值获取表的子集。例如,如果我有: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解决方案 感
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)}”“
文件…它将在每个新文件之前打印出”