Я имею два столбца, располагаю разграниченный .txt файл с интервалами, но первый столбец имеет пробелы (которые являются ошибками). Я должен преобразовать его в csv, но я не могу только заменить все пробелы запятыми.
Пример ввел:
gi|118592783|ref|ZP_01550172.1|_biphenyl-2 3-diol_1 2-dioxygenase_[Stappia_aggregata_IAM_12614] 1
Желаемый вывод:
gi|118592783|ref|ZP_01550172.1|_biphenyl-23-diol_12-dioxygenase_[Stappia_aggregata_IAM_12614],1
Как я могу использовать sed
(или что-либо еще) для замены последнего пространства подряд запятой затем удалите все остающиеся пространства? Это эффективно создало бы файл CSV?
Что-то как:
sed -r 's/(.*) /\1,/; s/ //g'
первая замена, будучи жадной, покроет все кроме последнего пространства в группе, заменяя последнее ,
. Второе затем устранит остальных.
Это сделало бы задание:
sed -r "s/\s([0-9]+$)/,\1/" filename.txt | tr -d ' '
или:
sed -r "s/\s([0-9]+$)/,\1/; s/\s//g" filename.txt
Входной пример:
gi|118592783|ref|ZP_01550172.1|_biphenyl-2 3-diol_1 2-dioxygenase_[Stappia_aggregata_IAM_12614] 1
Вывод:
gi|118592783|ref|ZP_01550172.1|_biphenyl-23-diol_12-dioxygenase_[Stappia_aggregata_IAM_12614],1
Вот гиковский путь - с sed циклом.
, который мы можем записать в GNU sed как
sed -e :1 -e '/^[^ ]* [^ ]*$/ s/ /,/' -e 's/ //; t1'
Тестирование:
$ echo 'gi|118592783|ref|ZP_01550172.1|_biphenyl-2 3-diol_1 2-dioxygenase_[Stappia_aggregata_IAM_12614] 1' |
sed -e :1 -e '/^[^ ]* [^ ]*$/ s/ /,/' -e 's/ //; t1'
gi|118592783|ref|ZP_01550172.1|_biphenyl-23-diol_12-dioxygenase_[Stappia_aggregata_IAM_12614],1
$ perl -ne 's/\s//g;s/^(.*)([[:digit:]])$/\1,\2/;print' input.txt
gi|118592783|ref|ZP_01550172.1|_biphenyl-23-diol_12-dioxygenase_[Stappia_aggregata_IAM_12614],1
или короче:
perl -pe 's/\s//g;s/^(.*)([[:digit:]])$/\1,\2/' input.txt
Effectivelly это - противоположность подхода muru: мы избавляемся от всех пробелов сначала, затем группируем все перед последним объектом (группа \1
) и последним объектом (группа \2
, два, который, оказывается, цифра). Мы заменяем строку группой \1
и \2
, разделяемой запятой.
Примечание, которое ([[:digit:]])
может быть изменено в (.)
для ссылки на любой символ, в случае, если это необходимо (т.е. если мы ожидаем, что последний символ будет иметь какой-либо тип), или мы можем использовать ([[:graph:]])
для контакта только с печатаемыми символами