awk 특정 필드를 잘라내어 각 줄의 끝에 추가하는 방법은 무엇입니까?

awk 특정 필드를 잘라내어 각 줄의 끝에 추가하는 방법은 무엇입니까?

문제가 있는 svn URL이 포함된 목록을 변환하고 싶습니다.

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

그러나 항상 마지막 변수를 얻습니다.

답변1

어크 v1

체크아웃할 모듈로 마지막 경로 요소와 함께 세 번째 경로 요소를 사용하려는 것 같습니다. 이 경우 awk에서 다음을 수행할 수 있습니다.

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

설명하다

split$NF배열은 하이픈으로 구분합니다 a(예 a[1] = issue: , a[2] = 001a[3] = name1). 그런 다음 처음 두 요소는 a세 번째 경로 요소( )와 연결되어 $6필요한 모듈 이름을 생성합니다.

어크 v2

awk 버전이 필드 구분 기호를 정규식으로 지정하는 것을 지원하는 경우 다음과 같은 간단한 대안을 사용할 수 있습니다.

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

sed

GNU sed 대안:

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

설명하다

  • (([^/]*/){5})처음 5개 경로 요소의 경우 주석 //개수는 2개 요소입니다.
  • ([^/]+)모듈 비트.
  • ([^/]+)분기 비트.
  • (([^-]+-){2})처음 두 개의 하이픈으로 구분된 요소 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

답변2

이 작업은 다음 방법으로도 쉽게 수행할 수 있습니다 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

답변3

다음 명령을 시도해 볼 수 있습니까?

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

답변4

$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

관련 정보