Используйте sed для замены последнего пространства в каждой строке с запятой, затем удалите все пробелы

Я имею два столбца, располагаю разграниченный .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?

7
задан 15 June 2017 в 11:02

4 ответа

Что-то как:

sed -r 's/(.*) /\1,/; s/ //g'

первая замена, будучи жадной, покроет все кроме последнего пространства в группе, заменяя последнее ,. Второе затем устранит остальных.

8
ответ дан 23 November 2019 в 06:13

Это сделало бы задание:

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
3
ответ дан 23 November 2019 в 06:13

Вот гиковский путь - с sed циклом.

  1. , если шаблон содержит только одиночный пробел, замените его запятой
  2. (иначе) заменяют первое пространство ничем и goto 1

, который мы можем записать в 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
3
ответ дан 23 November 2019 в 06:13

Perl

$ 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:]]) для контакта только с печатаемыми символами

3
ответ дан 23 November 2019 в 06:13

Другие вопросы по тегам:

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