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

チェックアウトするモジュールとして、最後のパス要素で3番目のパス要素を使用したいようです。この場合、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] = 001およびa[3] = name1)。次に、最初の2つの要素をa3番目のパス要素()に関連付けて、$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})最初の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

おすすめ記事