Como o awk pode cortar certos campos e adicionar ao final de cada linha?

4

Eu gostaria de converter uma lista contendo um monte de URLs svn de problemas:

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
    ...

em newlist.txt que mais nomes de comando e pasta svn para verificá-los, assim:

    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
    ...

Eu tentei algo como:

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

Mas sempre obteria a última variável.

    
por mr.chen 29.01.2013 / 09:16

4 respostas

3

awk v1

Parece que você deseja usar o terceiro elemento de caminho combinado com o último elemento de caminho como o módulo a ser verificado. Nesse caso, você pode fazer assim dentro do awk:

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

Explicação

split separa $NF nos hifens na matriz a (por exemplo, a[1] = issue , a[2] = 001 e a[3] = name1 ). Os dois primeiros elementos de a são então concatenados junto com o terceiro elemento de caminho ( $6 ) para produzir o nome do módulo desejado.

awk v2

Se a sua versão do awk suportar a especificação do separador de campos como uma expressão regular, você poderá usar esta alternativa mais simples:

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

sed

Uma alternativa do GNU sed:

sed -r 's:(([^/]*/){5})([^/]+)/([^/]+)/(([^-]+-){2})(.*):// :'

Explicação

  • (([^/]*/){5}) primeiros cinco elementos do caminho, note // conta para dois elementos.
  • ([^/]+) do bit do módulo.
  • ([^/]+) o bit da ramificação.
  • (([^-]+-){2}) primeiros dois elementos delimitados por hífen, por ex. issue-001- .

Saída em todos os casos

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
    
por 29.01.2013 / 09:52
1

Isso também pode ser feito facilmente com sed :

$ sed 's|\(.*/\(.*\)\)|svn co  |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
    
por 29.01.2013 / 09:30
1

Você pode tentar seguir o comando?

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

$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

    
por 20.04.2015 / 14:09

Tags