sed или awk для вставки вкладок (разделителей) в определенных положениях

Я пытаюсь разобрать таблицу с переменным числом разделителей для преобразования в таблицу равных столбцов:

cluster=96\troot\tcellular organisms\tno_rank no_rank$ cluster=42\troot\tcellular organisms\tBacteria\tno_rank\tno_rank\tsuperkingdom$ cluster=362\troot\tcellular organisms\tBacteria\tProteobacteria\tno rank\tno rank\tsuperkingdom\tphylum$ cluster=12330\troot\tcellular organisms\tBacteria\tTerrabacteria\tFirmicutes\tClostridia\tClostridiales\tClostridiaceae\tClostridium\tno rank\tno rank\tsuperkingdom\tno rank\tphylum\tclass\torder\tfamily\tgenus$ 

Ожидаемый результат:

  • awk персонаж-класс тайна
  • Выделите n-й столбец вывода ps
  • Вставка файла в другой файл с помощью sed
  • Как увеличить колонку с помощью AWK
  • Поиск конкретных слов и удаление всех строк после него
  • Печатать текст между (и включая) двумя разделителями по строке
  •  cluster=96\troot\tcellular organisms\t\t\t\t\t\t\t\tno_rank\tno_rank\t\t\t\t\t\t\t$ cluster=42\troot\tcellular organisms\tBacteria\t\t\t\t\t\t\tno_rank\tno_rank\tsuperkingdom\t\t\t\t\t\t$ cluster=362\troot\tcellular organisms\tBacteria\tProteobacteria\t\t\t\t\t\tno rank\tno rank\tsuperkingdom\tphylum\t\t\t\t\t$ cluster=12330\troot\tcellular organisms\tBacteria\tTerrabacteria\tFirmicutes\tClostridia\tClostridiales\tClostridiaceae\tClostridium\tno rank\tno rank\tsuperkingdom\tno rank\tphylum\tclass\torder\tfamily\tgenus$ 

    «\ t» – разделитель табуляции, а «$» – конец строки

  • Свернуть несколько повторяющихся частей последовательных строк
  • Полосы пробелов после одиночных заглавных букв с sed
  • сопоставление шаблонов sed
  • Поиск только одного слова в Unix
  • Как использовать sed для замены пути linux в определенном текстовом файле
  • Прокрутите список через awk
  • 2 Solutions collect form web for “sed или awk для вставки вкладок (разделителей) в определенных положениях”

    Использование Awk с двумя проходами:

     awk -F'\t' -v OFS='\t' 'FNR==NR {if (NF>a) {a=NF}; next} NF<a{$a=""} 1' file file 

    Это добавит дополнительные вкладки в конце строк с отсутствующими полями.


    Основываясь на ваших точных данных, я думаю, что вы, вероятно, имеете дело с проблемой, которую невозможно решить программно. Если вам нужны дополнительные вкладки в промежуточной позиции, чтобы гарантировать, что значения no_rank попадают в правый столбец, вам понадобится дополнительная логика.

    Использование Miller : я ответил на аналогичный вопрос для CSV, но в этом случае максимальная длина уже была доступна в строке заголовка, поэтому нет необходимости искать ее в другом месте.

    В этом случае, когда максимальная длина может быть в другом месте, я мог бы сделать лучшее:

     cat in.dat | mlr --nidx --fs tab --nidx put -q ' @maxnf = max(@maxnf, NF); @records[NR] = $*; # Retain @counts[NR] = NF; end { for (i in @records) { @record = @records[i]; for (j = @counts[i] + 1; j <= @maxnf; j += 1) { # add extra fields @record["x".j] = ""; } emit @record; # insert into the output record stream } } ' 

    Идея состоит в том, чтобы сохранить список записей и максимальный NF; затем обрабатывать в конечном блоке. Обратите внимание, что это использует функции в голове (не в последней версии 4.5.0).

    Linux и Unix - лучшая ОС в мире.