Заполнить пробелы соседними полями с условиями

gzipне создает блочные -сжатые файлы (подробности см. в RFC ), поэтому сам по себе он не подходит для произвольного доступа. Вы можете начинать чтение из потока и останавливаться, когда захотите, поэтому ваш пример curl -r 0-2024работает, но вы не можете выбрать поток в середине, если у вас нет дополнительного файла для предоставления недостающих данных (например, индексные файлы, созданныеgztool).

Чтобы достичь того, что вы пытаетесь сделать, вам нужно использовать какое-то блочное сжатие; напр. bgzip(, который создает файлы, которые могут быть распакованы простымgzip)или bzip2, и выполняет некоторую работу на принимающей стороне, чтобы определить, где лежат границы блока. Питер Кок написал несколько интересных постов на эту тему:BGZF -Заблокировано, больше и лучше GZIP! , Произвольный доступ к BZIP2?

0
25.01.2020, 07:15
1 ответ

Не уверен, что правильно понял ваш запрос, но как насчет

awk -F"\t" '
NR > 1  {i = 2
         while (i<=NF)  {if (!$i)       {while (!$(++i)) ;
                                         for (j=LAST+1; j<i; j++) $j = ($LAST == $i)?$LAST:"X"
                                        }
                         LAST = i++
                        }
        }
1
' OFS="\t" file

ID      s577    s592    s598    s600    s612    s650    s700    s822    s825    s830    s840    s870
line0   A       A       A       A       A       A       A       A       A       A       A       A
line1   B       B       B       B       X       X       X       X       NA      X       X       B
line2   B       X       X       A       A       A       A       A       A       A       A       A

Аннотированная версия по запросу:

awk -F"\t" '
NR > 1  {i = 2                                                  # Don't work on the header line
         while (i<=NF)  {if (!$i)       {while (!$(++i)) ;      # check every field if empty and
                                                                # increment i while seeing empty
                                                                # fields; i now holds next non-
                                                                # empty field 
                                         for (j=LAST+1; j<i; j++) $j = ($LAST == $i)?$LAST:"X"
                                                                # fill the empty fields with "X"
                                                                # or last non-empty field's value
                                                                # depending on actual and last
                                                                # fields' values being equal or not
                                        }
                         LAST = i++                             # retain last non-empty field
                        }
        }
1                                                               # default action: print
' OFS="\t" file
0
28.01.2020, 02:54

Теги

Похожие вопросы