ошибка во время цикла с sed

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

mmu-miR-15-5p/16-5p/195-5p/424-5p/497-5p 0610007P14Rik mmu-miR-326-3p/330-5p 0610007P14Rik mmu-miR-326-3p/330-5p Lmir mmu-miR-15/16/195/424/497 0610007P14Rik mmu-miR-15-5p/16-5p/195-5p/424-5p/497-5p/6838-5p 0610007P14Rik mmu-miR-15/16/195/424-5p/497 Alinf mmu-miR-326/330-5p 0610007P14Rik mmu-miR-326/330 0610007P14Rik mmu-miR-1/206/613 Crgi mmu-miR-1-3p/206 0610007P14Rik 

желаемый результат:

для первой линии

 mmu-miR-15-5p 0610007P14Rik mmu-miR16-5p 0610007P14Rik mmu-miR195-5p 0610007P14Rik mmu-miR424-5p 0610007P14Rik mmu-miR497-5p 0610007P14Rik 

и так далее…

Мне просто нужно заменить / на mmu-miR и создать новую строку вместе со вторым столбцом.

Я попытался использовать следующий код строки в bash:

 sed 's/\//\nmmu-miR/g' test.txt mmu-miR-15-5p mmu-miR16-5p mmu-miR195-5p mmu-miR424-5p mmu-miR497-5p 0610007P14Rik mmu-miR-326-3p mmu-miR330-5p 0610007P14Rik mmu-miR-326-3p mmu-miR330-5p Lmir 

Я попытался использовать цикл while и эту команду sed:

 while read line; do lineCols=( $line ); v1=($(echo "${lineCols[0]}")); v2=($(echo "${lineCols[1]}")); sed 's/\//\n/g' ${v1}; done <test.txt 

но получил сообщение об ошибке:

 sed: can't read mmu-miR-15-5p/16-5p/195-5p/424-5p/497-5p: No such file or directory sed: can't read mmu-miR-326-3p/330-5p: No such file or directory sed: can't read mmu-miR-326-3p/330-5p: No such file or directory sed: can't read mmu-miR-15/16/195/424/497: No such file or directory sed: can't read mmu-miR-15-5p/16-5p/195-5p/424-5p/497-5p/6838-5p: No such file or directory 

Что я делаю не так?

2 Solutions collect form web for “ошибка во время цикла с sed”

Как добиться этого с помощью awk

Для лучшей удобочитаемости / простоты использования создайте awk скрипт ( myScript.awk ) со следующим содержимым:

 { n=split($1, a, "/") split(a[1], b, "-") for (i=1; i<n+1; i++) { if (i == 1) { printf a[i]"\t"$2"\n" } else { printf b[1]"-"b[2]"-"a[i]"\t"$2"\n" } } } 

Как это работает:

 n=split($1, a, "/") 

Эта строка берет первое поле (например, "mmu-miR-15-5p/16-5p/195-5p/424-5p/497-5p" для первой строки), разделяет его на разделитель «/», сохраняет его в массиве a и сохраняет количество элементов, разделенных по n . Для первой строки:

 a[1] = "mmu-miR-15-5p" a[2] = "16-5p" a[3] = "195-5p" a[4] = "424-5p" a[5] = "497-5p" n = 5 

Помните, что для каждой строки выполняются инструкции awk поэтому результат будет отличаться для следующей строки!

 split(a[1], b, "-") 

Аналогично, эта строка берет первый элемент a и разбивает его на разделитель «-». Это дает:

 b[1] = "mmu" b[2] = "miR" b[3] = "15" b[4] = "5p" 

Когда у нас есть эти массивы, все, что нам нужно сделать, – это цикл по количеству выходных строк (число «/» разделенных элементов в строке ввода) и построить каждую строку с битами массивов a и b ! Мы должны сделать исключение для первой строки, потому a[1] уже содержит «mmu-miR-», следовательно, if дифференцировать этот случай!

Как запустить его

 awk -f myScript.awk input.txt 

Протестировал его, он выводит то, что вы просите в своем вопросе.

ПРИМЕЧАНИЕ. Как указано в моем комментарии к вашему вопросу, использование одного вызова awk является более эффективным и «совместимым с оболочкой», чем цикл в каждой строке вашего файла.

EDIT ПРИМЕЧАНИЕ. Я изменил сценарий, следующий за вашим комментарием. Должно быть хорошо сейчас!

Я думаю, вы ищете что-то вроде этого:

 cat inputFile.txt | while read line do eval `echo "$line" | sed 's|^\([^/]*\)/\([^ ]*\) \(.*\)|name="\1" ports=\2 tag="\3"|'` echo "$name $tag" realname=`echo "$name" | sed 's|-[0-9].*||'` for port in $(echo $ports | sed 's|/| |g') do echo "$realname-$port $tag" #or echo "$realname$port $tag", but I suspect a typo in your initial post done done 
  • Перенаправить ввод из файла, но показывать также в stdout?
  • В чем смысл числа, отображаемого echo $$?
  • Есть ли веская причина для запуска sudo su?
  • Добавить bash в базовое ядро ​​Linux?
  • Почему этот фрагмент оболочки проверяет, были ли хосты запущены с отключением netcat преждевременно?
  • Установите разницу между двумя файлами в unix
  • Как запускать несколько команд ssh параллельно и хранить выходные данные в переменных
  • Как сделать две команды потреблять входные данные из stdin последовательно?
  • Как установить псевдоним во всех оболочках tty?
  • Linux - сценарий оболочки и цветной текст
  • Смутно о поведении звездочки в команде ls
  • Linux и Unix - лучшая ОС в мире.