This is a test version of Biostars. For the public version, visit https://www.biostars.org.
Breaking PLINK.bim .bed .fam files into chromosomes

Hello,

I am trying to get haplotypes for one locus on chromosome19 and for that, I need phased data. However, prior to the phasing, I am supposed to split my PLINK files into separated files by chromosome. I found this script online but it doesn't work (see below). Can you please give me advice on how to do this? I am rather a newbie in the data processing so I am sorry if this is a too basic question.

Thank you!

#!/usr/bin/perl

# This script takes as input the base filename of binary pedfiles (*.bed, 
# *.bim, *.fam) and a base output filename and splits up a dataset by 
# chromosome. Useful for imputing to 1000 genomes. 

chomp(my $pwd = `pwd`); my $help = "\nUsage: $0 <BEDfile base> <output base>\n\n"; die $help if @ARGV!=2;

$infile_base=$ARGV[0]; #base filename of inputs $outfile_base=$ARGV[1]; #base filename of outputs $plink_exec="plink
--nonfounders --allow-no-sex --noweb"; $chr=22; #last chromosome to write out


for (1..$chr) {     print "Processing chromosome $_\n";     `$plink_exec
--bfile $infile_base --chr $_ --make-bed --out ${outfile_base}$_;` }
snp plink

3 answers

No need for scripts, simple loop should work, something like:

for chr in {1..23}; do \
plink --bfile myPlink --chr $chr --make-bed --out myPlink_${chr}; \
done

I think the correct format is (in case some codes are commented out):

#!/usr/bin/perl

# This script takes as input the base filename of binary pedfiles (*.bed,
# *.bim, *.fam) and a base output filename and splits up a dataset by
# chromosome. Useful for imputing to 1000 genomes.

chomp( my $pwd = `pwd` );
my $help = "\nUsage: $0 <BEDfile base> <output base>\n\n";
die $help if @ARGV != 2;

$infile_base  = $ARGV[0];    #base filename of inputs
$outfile_base = $ARGV[1];    #base filename of outputs
$plink_exec = "plink --nonfounders --allow-no-sex --noweb";
$chr = 22;                   #last chromosome to write out

for ( 1 .. $chr ) {
    print "Processing chromosome $_\n";
    `$plink_exec --bfile $infile_base --chr $_ --make-bed --out ${outfile_base}$_;`;
}

Nice solution, zx8754. However, a --make-bed or --recode flag is necessary, otherwise there won't be any output:

 for chr in {1..23}; do \ plink --bfile myPlink --chr $chr --make-bed
 --out myPlink_${chr}; \ done
  

Log in to answer this question.