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解决方案。
由于
答案 0 :(得分:1)
使用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
答案 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)
(
cat << EOF
chrom1 333
chrom1 343
chrom2 380
chrom2 501
chrom1 342
chrom3 102
EOF
) > file.txt
cat file.txt | cut -d" " -f1 | sort -u | while read c
do
cat file.txt | grep "^$c" | sort
echo
done