Заменить текстовый файл столбца i на увеличивающиеся числа

Пока ваш ввод представляет собой текст ASCII (до конца не содержит NUL 0x0 байтов), тогда sed -z делает то, что вы want:

$ sed -z ''
Line 1
Line 2
Line 3
^D
Line 1
Line 2
Line 3
$ 

-z заставляет sed обрабатывать нулевой байт как разделитель строк вместо обычного символа новой строки. Итак, пока ваш ввод представляет собой обычный текст без байтов NUL, sed будет продолжать считывать весь ввод в свой буфер шаблонов до тех пор, пока не будет достигнут EOF. sed тогда не обрабатывает буфер и выводит его.


Если во входных данных присутствуют нулевые байты, вы можете сделать это вместо этого:

sed ':l;N;bl'
1
13.04.2017, 15:36
3 ответа

Для нумерации строк вы можете использовать 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 ничем.

3
27.01.2020, 23:13

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

1
27.01.2020, 23:13

С 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
27.01.2020, 23:13

Теги

Похожие вопросы