awk split var两次

时间:2012-06-05 13:53:41

标签: awk split

我想用awk拆分一次var,这是我到目前为止所做的。

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

5 个答案:

答案 0 :(得分: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

如果需要澄清,请随时编辑您的问题。

我希望这会有所帮助。

答案 1 :(得分: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

答案 2 :(得分: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}'
    

    第一个参数是第一列。在第二个参数中,我询问第二列$2是否存在;如果是,则参数的值为$2;如果不是,则该值为第一列$1

答案 3 :(得分: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
  • 将大括号从第一个print之前移到split之前,并将分号放在原来的位置

答案 4 :(得分: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