Мне нужно сделать что-то очень похожее на этоЗаменить строку последовательным индексом, но мне не нужно добавлять число в столбец, а заменить целый столбец увеличивающимися числами. Вот так:
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)
Я чувствую себя очень глупо, но не могу приспособить ответ из этого вопроса к своему случаю...
решение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
ничем.
решение2
С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
решение3
С 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
выводит указанные строки, предваряя каждую строку ее номером и символом табуляции — идеально подходит для вашего формата с разделителями-табуляциями.