sed: замена пустых столбцов на NA - PullRequest
0 голосов
/ 03 мая 2018

У меня есть таблица из 9M строк, snp_collection.tab с пустыми значениями в нескольких столбцах:

snpID   freq_bin    ID_nearest_gene ID_nearest_gene_located_within  HGNC_nearest_gene_snpsnap   HGNC_nearest_gene_snpsnap_protein_coding    flag_snp_within_gene    flag_snp_within_gene_protein_coding
10:10001753      7  ENSG00000224788                 CELF2   FALSE   FALSE
10:10001794     41  ENSG00000224788                 CELF2   FALSE   FALSE
10:100023489    10  ENSG00000138131 ENSG00000138131 LOXL4   LOXL4   TRUE    TRUE
10:100025128    45  ENSG00000138131 ENSG00000138131 LOXL4   LOXL4   TRUE    TRUE
10:10002975      1  ENSG00000224788                 CELF2   FALSE   FALSE

Что для простоты выглядит следующим образом: enter image description here

Это запутывает, когда я позже разбираю его, используя awk, чтобы создать более полезную таблицу для моих целей:

Более поздний шаг, который испортился из-за грязного ввода:

tail -n+2 broadSNPs.tab | gawk -F'[:\t]' -vOFS="\t" '{ print "chr"$1, ($2 - 1), $2, $3, $18, $19, $20, $21}' > broadSNPs.bed

Здесь пустые пробелы не соблюдаются awk, и строки с пустыми пробелами смещаются в выходных данных.

Итак, я пытаюсь заполнить эти пустые места до awk.

Используя приведенный здесь совет, Заполнение пробела / табуляция разделены, пустые столбцы с 0 , я сделал:

sed 's/\t\t/\tNA\t/g' snp_collection.tab > broadSNPs.tab

Я также пытался заменить \t на ctrl+v+tab, но, увы, вывод остался таким же, как и в оригинальном snp_collection.tab, с пустыми пробелами, все еще просто пустыми.

Чего мне не хватает? Спасибо!

Желаемый выход:

snpID     freq_bin  ID_nearest_gene ID_nearest_gene_located_within  HGNC_nearest_gene_snpsnap   HGNC_nearest_gene_snpsnap_protein_coding    flag_snp_within_gene    flag_snp_within_gene_protein_coding
10:10001753      7  ENSG00000224788             NA     NA   CELF2   FALSE   FALSE
10:10001794     41  ENSG00000224788             NA     NA   CELF2   FALSE   FALSE
10:100023489    10  ENSG00000138131 ENSG00000138131 LOXL4   LOXL4   TRUE    TRUE
10:100025128    45  ENSG00000138131 ENSG00000138131 LOXL4   LOXL4   TRUE    TRUE
10:10002975      1  ENSG00000224788             NA     NA   CELF2   FALSE   FALSE

С этим фиксированным вводом моя команда awk не должна выдавать бессмысленный вывод.

1 Ответ

0 голосов
/ 04 мая 2018

Самое простое решение - сообщить awk, что одна вкладка (\t) является разделителем полей:

Поведение по умолчанию для awk для обработки любого последовательного пробела в качестве разделителя полей:

echo -e "A\tB\t\tC\tD" | awk '{ print "c1="$1, "c2="$2, "c3="$3, "c4="$4, "c5="$5 }'
c1=A c2=B c3=C c4=D c5=

Обратите внимание, как awk обрабатывает две последовательные вкладки как один разделитель, т. Е. Мы хотим, чтобы C char был 4-м столбцом, но он отображается как 3-й столбец.

При указании одной вкладки в качестве разделителя столбец 3 будет пустым:

echo -e "A\tB\t\tC\tD" | awk -F'\t' '{ print "c1="$1, "c2="$2, "c3="$3, "c4="$4, "c5="$5 }'
c1=A c2=B c3= c4=C c5=D

Для получения дополнительной информации см .:

https://stackoverflow.com/a/30406868/1515117

...