Как 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 для их проверки, например:

  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 

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

  • Как заменить определенную строку с помощью sed или awk на основе команды run
  • использование системной команды в awk-скрипте
  • Как суммировать значения двух строк в строке в linux
  • Как печатать из разделителя полей ":" до конца строки?
  • Как выводить несколько строк с использованием одного условия?
  • AWK Поиск массивного файла и запись в имя переменной
  • Вычислять хиты в течение промежутка времени из файла журнала
  • Соответствие регулярных выражений на awk в командной строке
  • 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 - лучшая ОС в мире.