1

varをawkで2回分割したいのですが、これは私がこれまでに得たものです。

awk -v p=1,3,8,25-27,4-16 '{split(p,t,",");for (i in t) if(t[i] ~ /-/) split(t[i],t1,"-") {print "-dFirstPage=" t1[1] ,"-dFirstPage=" t1[2]} ELSE {print "-dFirstPage=" t[i] ,"-dFirstPage=" t[i]}}' >outfile

出力は

-dFirstPage=1 -dLastPage=1
-dFirstPage=3 -dLastPage=3
-dFirstPage=8 -dLastPage=8
-dFirstPage=25 -dLastPage=27
-dFirstPage=4 -dLastPage=16
4

5 に答える 5

1

あなたは非常に近くにいます(しかし、このソリューションがあなたの最終的な要件を本当に満たすかどうかはわかりません)。

 awk -v p=1,3,8,25-27,4-16 '
 END{
        split(p,t,",");
  for (i in t) {
    if(t[i] ~ /-/) {
        split(t[i],t1,"-");
      print "-dFirstPage=" t1[1] ,"-dFirstPage=" t1[2]
    }
    else {
      print "-dFirstPage=" t[i] ,"-dFirstPage=" t[i]
    }
  }
}' /dev/null > outfile

Windowsおよびより一般的なソリューション向けに改訂

 echo "1,3,8,25-27,4-16" \
 | awk '
 {
   split($0,t,",");
   for (i in t) {
     if(t[i] ~ /-/) {
        split(t[i],t1,"-");
        print "-dFirstPage=" t1[1] ,"-dFirstPage=" t1[2]
     }
     else {
       print "-dFirstPage=" t[i] ,"-dFirstPage=" t[i]
     }
   }
 }' > outfile

明確にする必要がある場合は、質問を自由に編集してください。

これがお役に立てば幸いです。

于 2012-06-05T14:00:49.373 に答える
1

bash

#!/bin/bash

vars=1,3,8,25-27,4-16

for pages in `echo $vars | tr ',' '\n'`; do
    if [[ -n $( echo $pages | grep --only-matching "-" ) ]]; then
        firstPage=`echo ${pages%%-*}`
        lastPage=`echo ${pages##*-}`
    else
        firstPage=$pages
        lastPage=$pages
    fi
    echo "-dFirstPage=${firstPage} -dLastPage=${lastPage}"
done

出力:

-dFirstPage=1 -dLastPage=1
-dFirstPage=3 -dLastPage=3
-dFirstPage=8 -dLastPage=8
-dFirstPage=25 -dLastPage=27
-dFirstPage=4 -dLastPage=16

@shellterのアドバイスを適用します。

#!/bin/bash

vars=1,3,8,25-27,4-16
for pages in `echo $vars | tr ',' '\n'`; do
    case $pages in
        *-* )
            firstPage=${pages%%-*}
            lastPage=${pages##*-}
            ;;
        * )
            firstPage=$pages
            lastPage=$pages
            ;;
    esac
    echo "-dFirstPage=${firstPage} -dLastPage=${lastPage}"
done
于 2012-06-05T14:06:17.923 に答える
1

pの値をawkへの入力として渡してもらえますか?この場合、私はそれをこのようにします:

$ echo 1,3,8,25-27,4-16 | awk -F- -v RS=, '{printf "-dFirstPage=%s -dLastPage=%s\n", $1, $2?$2:$1}'
-dFirstPage=1 -dLastPage=1
-dFirstPage=3 -dLastPage=3
-dFirstPage=8 -dLastPage=8
-dFirstPage=25 -dLastPage=27
-dFirstPage=4 -dLastPage=16

これがどのように機能するか:

  • カンマがレコード区切り文字(-v RS=,)になり、ハイフンがフィールド区切り文字(-F-)になることを定義します。だから、入力

    1,3,8,25-27,4-16
    

    ほぼ同等になります

    1
    3
    8
    25 27
    4 16
    
  • 次に、私は使用しますprintf

    '{printf "-dFirstPage=%s -dLastPage=%s\n", $1, $2?$2:$1}'
    

    最初のパラメーターは最初の列です。$22番目のパラメーターでは、2番目の列が存在するかどうかを尋ねます。その場合、パラメータの値は$2;です。いいえの場合、値は最初の列$1です。

于 2012-06-05T14:43:41.997 に答える
1

あなたはとても近かった:

awk -v p=1,3,8,25-27,4-16 'BEGIN {split(p,t,",");for (i in t) if(t[i] ~ /-/) {split(t[i],t1,"-"); print "-dFirstPage=" t1[1] ,"-dFirstPage=" t1[2]} else {print "-dFirstPage=" t[i] ,"-dFirstPage=" t[i]}}' >outfile
  • BEGIN句を使用する
  • 「ELSE」をに変更しますelse
  • 中括弧を最初の前から前に移動しprintsplitセミコロンをその場所に配置します
于 2012-06-05T16:44:11.237 に答える
1

必要なのは:for、echo、if

あなたがそれを何千回もしなければならないなら何倍も速く

vars=1,3,8,25-27,4-16
f='-dfirstpage='
l='-dlastpage='

for pages in ${vars//,/ }; do
   if [[ -n ${pages//[[:digit:]]/} ]]; then
      echo "${f}${pages%%-*} ${l}${pages##*-}"
   else
      echo "${f}${pages} ${l}${pages}"
   fi
done

出力

-dFirstPage=1 -dLastPage=1
-dFirstPage=3 -dLastPage=3
-dFirstPage=8 -dLastPage=8
-dFirstPage=25 -dLastPage=27
-dFirstPage=4 -dLastPage=16
于 2018-05-09T15:11:14.910 に答える