Заменить столбец i текстового файла на возрастающие числа

Заменить столбец i текстового файла на возрастающие числа

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

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

Связанный контент