Замените текстовый файл столбца i с добавочными номерами

Мне нужно сделать что-то очень похожее на эту строку Replace с последовательным индексом , но мне не нужно добавлять число в столбец, но подставлять целую колонку с добавочными числами. Как это:

0 0 chr1 3000575 3000801 0 chr1 4340023 4340249 32 32 0 0 chr1 3000641 3000801 -1 chr1 3311943 3311783 32 32 0 0 chr1 3000674 3000801 -1 chr1 3001534 3001407 32 32 0 0 chr1 3000674 3000801 -1 chr1 3001534 3001407 32 32 0 0 chr1 3000674 3000801 -1 chr1 3001534 3001407 32 32 

становится

 0 0 chr1 3000575 3000801 0 chr1 4340023 4340249 32 32 1 0 chr1 3000641 3000801 -1 chr1 3311943 3311783 32 32 2 0 chr1 3000674 3000801 -1 chr1 3001534 3001407 32 32 3 0 chr1 3000674 3000801 -1 chr1 3001534 3001407 32 32 4 0 chr1 3000674 3000801 -1 chr1 3001534 3001407 32 32 

(Меня не волнует, начинается ли оно с 0 или 1)

Я чувствую себя очень глупо, но я не могу приспособить решение этого вопроса к моему делу …

3 Solutions collect form web for “Замените текстовый файл столбца i с добавочными номерами”

Для номера строк вы можете использовать nl . Чтобы удалить столбцы (или, скорее, отфильтровать те, которые вы хотите сохранить), вы можете использовать cut :

 $ cut -f 2- cols.txt | nl 1 0 chr1 3000575 3000801 0 chr1 4340023 4340249 32 32 2 0 chr1 3000641 3000801 -1 chr1 3311943 3311783 32 32 3 0 chr1 3000674 3000801 -1 chr1 3001534 3001407 32 32 4 0 chr1 3000674 3000801 -1 chr1 3001534 3001407 32 32 5 0 chr1 3000674 3000801 -1 chr1 3001534 3001407 32 32 

Единственная неприятная вещь с nl заключается в том, что она вставляет пробел в начале строки (по умолчанию поле номера строки имеет ширину 6 символов, и вы не хотите ее понижать, потому что оно усекает номера строк). Мы можем избавиться от них так:

 $ cut -f 2- cols.txt | nl | sed 's/^ *//' 1 0 chr1 3000575 3000801 0 chr1 4340023 4340249 32 32 2 0 chr1 3000641 3000801 -1 chr1 3311943 3311783 32 32 3 0 chr1 3000674 3000801 -1 chr1 3001534 3001407 32 32 4 0 chr1 3000674 3000801 -1 chr1 3001534 3001407 32 32 5 0 chr1 3000674 3000801 -1 chr1 3001534 3001407 32 32 

Утилита cut принимает список столбцов, которые вы хотите «вырезать» из ввода. В нашем случае это столбцы 2 и далее ( -f 2- ). Поскольку ваши данные разделены табуляцией, cut будет делать это без изменений, иначе можно сказать, что использовать другой разделитель с -d .

Команда sed просто заменит эти пробелы в начале строки из nl ничем.

С awk

 $ awk '{$1=FNR-1; print}' OFS='\t' file 0 0 chr1 3000575 3000801 0 chr1 4340023 4340249 32 32 1 0 chr1 3000641 3000801 -1 chr1 3311943 3311783 32 32 2 0 chr1 3000674 3000801 -1 chr1 3001534 3001407 32 32 3 0 chr1 3000674 3000801 -1 chr1 3001534 3001407 32 32 4 0 chr1 3000674 3000801 -1 chr1 3001534 3001407 32 32 

С ed (используя литеральную вкладку, состоящую из Ctrl-V + TAB , в подстановке)

 $ ed -s file << EOF ,s/0 // ,n q EOF 1 0 chr1 3000575 3000801 0 chr1 4340023 4340249 32 32 2 0 chr1 3000641 3000801 -1 chr1 3311943 3311783 32 32 3 0 chr1 3000674 3000801 -1 chr1 3001534 3001407 32 32 4 0 chr1 3000674 3000801 -1 chr1 3001534 3001407 32 32 5 0 chr1 3000674 3000801 -1 chr1 3001534 3001407 32 32 

Команда (.,.)n печатает адресованные строки, перед каждой строкой по номеру строки и вкладке – идеально подходит для вашего формата с разделителями табуляции.

  • awk для замены столбцов и печати, если условие выполнено
  • текущий фиксированный трек в строке состояния dwm
  • Как выполнить замену текста в иерархии больших папок?
  • Как я могу печатать строки из файла назад (без использования «tac»)?
  • Сценарий оболочки - помощь в обработке текста
  • удалить TAG / TAA / TGA
  • Внедрить включение другого файла в поток (чтение из stdin)
  • Сравнение awk с использованием массивов
  • Ошибка: неоднозначное перенаправление при передаче вывода команде
  • Возьмите два столбца в файле с разделителями табуляции и объедините их в один
  • Объединение совпадающих столбцов с двумя файлами или использование значения по умолчанию
  • Linux и Unix - лучшая ОС в мире.