Как awk разрезать определенные поля и добавить к концу каждой строки?

Я хотел бы преобразовать список, содержащий кучу URL-адресов svn проблем:

cat list.txt //svn.server.address/repos/project/module1/branches/issue-001-name1 //svn.server.address/repos/project/module2/branches/issue-002-name2 //svn.server.address/repos/project/module3/branches/issue-003-name3 ... 

в файл newlist.txt, который плюс имена команд и папок svn для их проверки, например:

  • Редактирование столбцов с помощью awk или sed. как напечатать следующий шаблон?
  • проверять содержимое файла с помощью регулярных выражений bash
  • Усреднение и перемещение набора файлов
  • Есть ли способ сделать этот однострочный лайнер быстрее?
  • использование sed / awk в переменных сценария bash
  • Заменить несколько строк в текстовом файле фиксированным шаблоном
  •   svn co //svn.server.address/repos/project/module1/branches/issue-001-name1 issue-001-module1 svn co //svn.server.address/repos/project/module2/branches/issue-002-name2 issue-002-module2 svn co //svn.server.address/repos/project/module3/branches/issue-003-name3 issue-003-module3 ... 

    Я пробовал что-то вроде:

     eval $(awk -F'/branches/' '{print $2}' list.txt|awk -F'-' '{print "i="$1"-"$2}') eval $(awk -F'/branches/' '{print $1}' list.txt|awk -F'/' '{print "j="$NF}') name=$i"-"$j awk '{print "svn co "$1" "n}' n=$name list.txt >newlist.txt 

    Но он всегда будет иметь последнюю переменную, я абсолютно новичок, поэтому любая помощь будет принята с благодарностью!

  • Как избежать проводов awk для awk?
  • Номера индексов sed / awk в химических формулах с использованием меток разметки
  • Использование функции оболочки bash внутри AWK
  • Использование sed / awk для изменения слов между двумя шаблонами
  • Как удалить строку на основе Delimeter в perl / Shell?
  • Что такое * .sorted команда и почему она не работает в моем bash?
  • 4 Solutions collect form web for “Как awk разрезать определенные поля и добавить к концу каждой строки?”

    awk v1

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

     awk -F/ ' { split($NF, a, "-") module=a[1] "-" a[2] "-" $6 print "svn co " $0 " " module }' list.txt 

    объяснение

    split разделяет $NF на дефисы в массив (например, a[1] = issue , a[2] = 001 и a[3] = name1 ). Первые два элемента a затем объединяются вместе с третьим элементом пути ( $6 ), чтобы создать желаемое имя модуля.

    awk v2

    Если ваша версия awk поддерживает задание разделителя полей как регулярного выражения, вы можете использовать эту более простую альтернативу:

     awk -F'[/-]' '{ print "svn co " $0 " " $8 "-" $9 "-" $6 }' list.txt 

    СЕПГ

    Альтернатива GNU sed:

     sed -r 's:(([^/]*/){5})([^/]+)/([^/]+)/(([^-]+-){2})(.*):\1\3/\4/\5\7 \5\3:' 

    объяснение

    • (([^/]*/){5}) первые пять элементов пути, обратите внимание // подсчитывает два элемента.
    • ([^/]+) бит модуля.
    • ([^/]+) бит ветви.
    • (([^-]+-){2}) первые два issue-001- элемента, например issue-001- .

    Выход во всех случаях

     svn co //svn.server.address/repos/project/module1/branches/issue-001-name1 issue-001-module1 svn co //svn.server.address/repos/project/module2/branches/issue-002-name2 issue-002-module2 svn co //svn.server.address/repos/project/module3/branches/issue-003-name3 issue-003-module3 

    Это также можно легко выполнить с помощью sed :

     $ sed 's|\(.*/\(.*\)\)|svn co \1 \2|g' file svn co //svn.server.address/repos/project/module1/branches/issue-001-name1 issue-001-name1 svn co //svn.server.address/repos/project/module2/branches/issue-002-name2 issue-002-name2 svn co //svn.server.address/repos/project/module3/branches/issue-003-name3 issue-003-name3 

    Можете ли вы попробовать выполнить команду?

     cat list.txt | awk -F'/branches/' '{a=gensub(/name/,"module", 1, $2); print "svn co "$0" " a}' 

    $cat d.txt //svn.server.address/repos/project/module1/branches/issue-001-name1 //svn.server.address/repos/project/module2/branches/issue-002-name2 //svn.server.address/repos/project/module3/branches/issue-003-name3 $awk 'BEGIN{FS="/"}{print "svn","co",$0,$8}' d.txt svn co //svn.server.address/repos/project/module1/branches/issue-001-name1 issue-001-name1 svn co //svn.server.address/repos/project/module2/branches/issue-002-name2 issue-002-name2 svn co //svn.server.address/repos/project/module3/branches/issue-003-name3 issue-003-name3

    Linux и Unix - лучшая ОС в мире.