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