Повторите поле, если поле ниже пусто - PullRequest
0 голосов
/ 18 июня 2019

У меня есть файл с разделителями табуляции

1A      21      .        SMO     gene_start
1A      3940    .        SMO     gene_end
1A      52236   .        LOC105758527    gene_start
1A      55001   0.469590
1A      65001   0.067909
1A      75001   0.220712
1A      78812   .        LOC105758527    gene_end
1A      79831   .        LOC100218126    gene_start
1A      85001   0.174872
1A      93700   .        LOC100218126    gene_end
1A      96312   .        LOC105758528    gene_start
1A      98792   .        LOC105758528    gene_end
1A      115136  .        LOC105758529    gene_start
1A      125001  0.023420
1A      126187  .        LOC105758529    gene_end

...

, и мне нужно заполнить пустые поля в столбце 4, повторив то, что находится прямо над ним.

1A      21      .        SMO     gene_start
1A      3940    .        SMO     gene_end
1A      52236   .        LOC105758527    gene_start
1A      55001   0.469590 LOC105758527
1A      65001   0.067909 LOC105758527
1A      75001   0.220712 LOC105758527
1A      78812   .        LOC105758527    gene_end
1A      79831   .        LOC100218126    gene_start
1A      85001   0.174872 LOC100218126
1A      93700   .        LOC100218126    gene_end
1A      96312   .        LOC105758528    gene_start
1A      98792   .        LOC105758528    gene_end
1A      115136  .        LOC105758529    gene_start
1A      125001  0.023420 LOC105758529
1A      126187  .        LOC105758529    gene_end

...

Я делаю

awk 'NF==5{v=$4;print} NF==3{print v,$0}' file

, но я получаю это

1A      21      .       SMO     gene_start
1A      3940    .       SMO     gene_end
1A      52236   .       LOC105758527    gene_start
LOC105758527 1A 55001   0.469590
LOC105758527 1A 65001   0.067909
LOC105758527 1A 75001   0.220712
1A      78812   .       LOC105758527    gene_end
1A      79831   .       LOC100218126    gene_start
LOC100218126 1A 85001   0.174872
1A      93700   .       LOC100218126    gene_end
1A      96312   .       LOC105758528    gene_start
1A      98792   .       LOC105758528    gene_end
1A      115136  .       LOC105758529    gene_start
LOC105758529 1A 125001  0.023420
1A      126187  .       LOC105758529    gene_end

Не могу сказать, что изменить

xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx

Ответы [ 3 ]

1 голос
/ 18 июня 2019

Примерно так:

awk '!$4 {$0=$0 FS t} {t=$4} 1' "OFS=\t" file
1A      21      .        SMO     gene_start
1A      3940    .        SMO     gene_end
1A      52236   .        LOC105758527    gene_start
1A      55001   0.469590 LOC105758527
1A      65001   0.067909 LOC105758527
1A      75001   0.220712 LOC105758527
1A      78812   .        LOC105758527    gene_end
1A      79831   .        LOC100218126    gene_start
1A      85001   0.174872 LOC100218126
1A      93700   .        LOC100218126    gene_end
1A      96312   .        LOC105758528    gene_start
1A      98792   .        LOC105758528    gene_end
1A      115136  .        LOC105758529    gene_start
1A      125001  0.023420 LOC105758529
1A      126187  .        LOC105758529    gene_end

Или то же самое покороче:

awk '!$4?$0=$0FS t:t=$4' OFS="\t" file

Четвертого поля не существует: ложь, хранить $4 до t
Четвёртое поле не существует: true, добавьте t в строку

Укороченная версия Juans

awk 'NF==5?v=$4:$4=v' OFS="\t" file
1 голос
/ 18 июня 2019

Предполагается, что присутствуют все вкладки-разделители полей, даже если поля пусты, как в любом обычном файле CSV или TSV:

$ awk 'BEGIN{FS=OFS="\t"} $4==""{$4=prev} {prev=$4} 1' file
1A      21      .       SMO     gene_start
1A      3940    .       SMO     gene_end
1A      52236   .       LOC105758527    gene_start
1A      55001   0.469590        LOC105758527
1A      65001   0.067909        LOC105758527
1A      75001   0.220712        LOC105758527
1A      78812   .       LOC105758527    gene_end
1A      79831   .       LOC100218126    gene_start
1A      85001   0.174872        LOC100218126
1A      93700   .       LOC100218126    gene_end
1A      96312   .       LOC105758528    gene_start
1A      98792   .       LOC105758528    gene_end
1A      115136  .       LOC105758529    gene_start
1A      125001  0.023420        LOC105758529
1A      126187  .       LOC105758529    gene_end
1 голос
/ 18 июня 2019

Просто присвойте свое сохраненное значение полю " отсутствует ":

awk 'NF==5{v=$4}NF==3{$4=v}1' OFS="\t" file

* В конце 1 - это всего лишь ярлык, чтобы избежать использования оператора печати. ​​

В awk, когда условие соответствует, действие по умолчанию состоит в печати строки ввода.

$ echo "test" |awk '1'

Эквивалентно:

echo "test"|awk '1==1'

echo "test"|awk '{if (1==1){print}}'

Это потому, что 1всегда будет правдой

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...