Попытка использовать этот файл...
MT 200610-1 100 2757
MT 200610-10 100 6753
MT 200610-100 100 15173
Хотите создать новый файл, который выглядит следующим образом, используя столбцы 1, 2 и 4...
chrMT 2756 2757 200610-1
chrMT 6752 6753 200610-10
chrMT 15172 15173 200610-100
Если я сделаю только первые три, то это сработает.
awk 'BEGIN{FS=="\t";OFS=="\t"}{print "chr"$1,$4-1,$4}' test_ace_geno1.map
chrMT 2756 2757
chrMT 6752 6753
chrMT 15172 15173
Если я попытаюсь добавить 2-й столбец в конце, произойдет что-то странное...
awk 'BEGIN{FS=="\t";OFS=="\t"}{print "chr"$1,$4-1,$4,$2}' test_ace_geno1.map
200610-16 2757
200610-10 6753
200610-100 15173
Если я работаю с vim со списком наборов, он показывает, что это обычная вкладка, поэтому я не уверен, что происходит здесь с этим столбцом, который портит все это.
MT^I200610-1^I100^I2757$
MT^I200610-10^I100^I6753$
MT^I200610-100^I100^I15173$
решение1
с dos
окончаниями строк стиля:
$ cat -e ip.txt
MT 200610-1 100 2757^M$
MT 200610-10 100 6753 ^M$
MT 200610-100 100 15173^M$
$ awk 'BEGIN{FS=="\t";OFS=="\t"}{print "chr"$1,$4-1,$4}' ip.txt
chrMT 2756 2757
chrMT 6752 6753
chrMT 15172 15173
$ awk 'BEGIN{FS=="\t";OFS=="\t"}{print "chr"$1,$4-1,$4,$2}' ip.txt
200610-16 2757
chrMT 6752 6753 200610-10
200610-100 15173
С помощью perl
этого метода можно обрабатывать как dos
окончание строки стиля, так и получение требуемого вывода:
$ perl -lane 'print "chr$F[0]\t", $F[3]-1, "\t$F[3]\t$F[1]"' ip.txt
chrMT 2756 2757 200610-1
chrMT 6752 6753 200610-10
chrMT 15172 15173 200610-100
С помощью awk
измените окончание строки на unix
стиль first, с помощью , dos2unix
если доступно, или с помощьюperl
$ perl -i -pe 's|\r\n|\n|' ip.txt
$ cat -e ip.txt
MT 200610-1 100 2757$
MT 200610-10 100 6753 $
MT 200610-100 100 15173$
а потом
$ awk -v OFS='\t' '{print "chr"$1,$4-1,$4,$2}' ip.txt
chrMT 2756 2757 200610-1
chrMT 6752 6753 200610-10
chrMT 15172 15173 200610-100
или, с помощью GNU awk
, установите входную запись для обработки окончания строки в стиле DOS
gawk -v RS='\r\n' -v OFS='\t' '{print "chr"$1,$4-1,$4,$2}' ip.txt
решение2
Введите все данные в print
операторе в желаемом формате и выполните все необходимые операции, например вычитание $NF - 1
:
awk '{print "chr" $1, ($NF - 1), $NF, $2}' file.txt
Очевидно, здесь можно использовать $4
вместо $NF
, но поскольку 4-е поле является последним, оба они будут указывать на одно и то же поле.
Пример:
% awk '{print "chr" $1, ($NF - 1), $NF, $2}' file.txt
chrMT 2756 2757 200610-1
chrMT 6752 6753 200610-10
chrMT 15172 15173 200610-100