This is a test version of Biostars. For the public version, visit https://www.biostars.org.
awk to organize bed file

Hi folk, I have a bed file like this:

AAeBV_JXPU01118970.1_163_1090   1091    164
AAeliv_supercont1.1288_9956_11805   11806   9957
AAeliv_supercont1.152_1983674_1982874   9573    10955
AAeliv_supercont1.172_482498_480625 10001   11983
AAeliv_supercont1.184_260250_259840 10001   10411
AAeliv_supercont1.219_1484226_1486015   11790   10001
AAeliv_supercont1.240_1286280_1287235   10092   10808
AAeliv_supercont1.286_1347920_1346848   11073   10001
AAeliv_supercont1.286_1361694_1362031   10001   10338
AAeliv_supercont1.286_1441550_1443009   10001   11460

I want to organize columns 2 and 3 by length, generating an output like that:

**AAeBV_JXPU01118970.1_163_1090 164   1091
**AAeliv_supercont1.1288_9956_11805 9957   11806
AAeliv_supercont1.152_1983674_1982874   9573    10955
AAeliv_supercont1.172_482498_480625 10001   11983
AAeliv_supercont1.184_260250_259840 10001   10411
**AAeliv_supercont1.219_1484226_1486015 10001   11790
AAeliv_supercont1.240_1286280_1287235   10092   10808
**AAeliv_supercont1.286_1347920_1346848 10001   11073
AAeliv_supercont1.286_1361694_1362031   10001   10338
AAeliv_supercont1.286_1441550_1443009   10001   11460

** represents lines modified.

So I wrote this awk:

awk '{n1=$2;n2=$3;if($2 > $3)$2=n2 && $3=n1;print $0}'

briefly, I put the value of column $2 in a variable n1, the value of column $3 in a variable n2, if $2 is grater than $3, the values should be replaced, and the line printed.

But, the output is:

**AAeBV_JXPU01118970.1_163_1090 1 1091
**AAeliv_supercont1.1288_9956_11805 1 11806
AAeliv_supercont1.152_1983674_1982874   9573    10955
AAeliv_supercont1.172_482498_480625 10001   11983
AAeliv_supercont1.184_260250_259840 10001   10411
**AAeliv_supercont1.219_1484226_1486015 1 11790
AAeliv_supercont1.240_1286280_1287235   10092   10808
**AAeliv_supercont1.286_1347920_1346848 1 11073
AAeliv_supercont1.286_1361694_1362031   10001   10338
AAeliv_supercont1.286_1441550_1443009   10001   11460

The minor value is replaced by 1, can anyone explain to me that incongruence? thanks.

awk bed

1 answer

The problem seems to be this statement:

$2=n2 && $3=n1

This seems to evaluate to 1. Instead write this:

$ awk '{n1=$2;n2=$3;if($2 > $3) {$2=n2; $3=n1} print $0}'

thanks finswimmer, that resolved

Log in to answer this question.