использование awk для создания нового файла приводит к проблемам с использованием 1 определенного столбца, не могу понять, в чем проблема

использование awk для создания нового файла приводит к проблемам с использованием 1 определенного столбца, не могу понять, в чем проблема

Попытка использовать этот файл...

    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

Связанный контент