Замените текстовый файл столбца 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)

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

Для номера строк вы можете использовать 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 печатает адресованные строки, перед каждой строкой по номеру строки и вкладке – идеально подходит для вашего формата с разделителями табуляции.