Как использовать sed, чтобы разбить строку? - PullRequest
2 голосов
/ 20 апреля 2020

Я новичок в bash сценариях. Я хочу разбить следующую строку,

chr14:81370042-81371098(+)

на

chr14 81370042 81371098 +

или

chr14:81370042-81371098(-)

на

chr14 81370042 81371098 -

Пожалуйста, скажите мне Как мне сделать это с помощью одной команды, которая будет работать в обоих случаях.

Я пытался, cat a.tsv | tr -s ':' '\t' | sed "s/\t[0-9]+.*[0-9]+/[0-9]+\t[0-9]/g", это не работает.

Спасибо.

Ответы [ 3 ]

3 голосов
/ 20 апреля 2020
$ sed 's/[():]/ /g; s/-/ /' file
chr14 81370042 81371098 +
chr14 81370042 81371098 -

или если вам не нравится конечный пустой символ, который уходит, то:

$ sed 's/[(:]/ /g; s/)//; s/-/ /' file
chr14 81370042 81371098 +
chr14 81370042 81371098 -
2 голосов
/ 20 апреля 2020

Это sed может работать:

sed -E 's/[^-+_[:alnum:]]+/ /g; s/ +$//; s/-(.)/ \1/g' <<< 'chr14:81370042-81371098(+)'

chr14 81370042 81371098 +

Иначе:

sed -E 's/[^-+_[:alnum:]]+/ /g; s/ +$//; s/-(.)/ \1/g' <<< 'chr14:81370042-81371098(-)'

chr14 81370042 81371098 -

[^-+_[:alnum:]]+ соответствует 1 или более любому символу, который не является -, +, _ и alphanumeri c.

1 голос
/ 20 апреля 2020

Написано и протестировано с показанными образцами. Не могли бы вы попробовать следующее.

echo "chr14:81370042-81371098(+)" | awk '{gsub(/:|-|\(|\)/,OFS)} 1'

2-е решение: Использование разделителя полей в awk.

echo "chr14:81370042-81371098(+)"  | 
awk -v FS=':|-|\(|\)' '{
  $1=$1
  sub(/ +$/,"")
}
1'
...