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