awk分割var两次

awk分割var两次,awk,split,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 输出应为 -dFir

我想用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
您的位置非常接近(但我不确定此解决方案是否真的能满足您的最终需求)

针对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
如果需要澄清,请随意编辑您的问题

我希望这对您有所帮助。

非常接近(但我不确定此解决方案是否真的能满足您的最终需求)

针对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
如果需要澄清,请随意编辑您的问题

我希望这有帮助。

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

应用@Sheller的一些建议:

#!/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
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

应用@Sheller的一些建议:

#!/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

能否将
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
工作原理:

  • 我将逗号定义为记录分隔符(
    -vrs=,
    ),连字符定义为字段分隔符(
    -F-
    )。因此,输入

    1,3,8,25-27,4-16
    
    大致相当于

    1
    3
    8
    25 27
    4 16
    
  • 然后,我使用:

    第一个参数是第一列。在第二个参数中,我询问第二列
    $2
    是否存在;如果是,则参数值为
    $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
工作原理:

  • 我将逗号定义为记录分隔符(
    -vrs=,
    ),连字符定义为字段分隔符(
    -F-
    )。因此,输入

    1,3,8,25-27,4-16
    
    大致相当于

    1
    3
    8
    25 27
    4 16
    
  • 然后,我使用:

    第一个参数是第一列。在第二个参数中,我询问第二列
    $2
    是否存在;如果是,则参数值为
    $2
    ;如果否,则值为第一列
    $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
  • 将大括号从第一个
    打印
    之前移动到
    拆分
    之前,并在其所在位置放置分号
你非常接近:

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
  • 将大括号从第一个
    打印
    之前移动到
    拆分
    之前,并在其所在位置放置分号

您只需要: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

您只需要: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

很好的替代解决方案!良好地使用${pages%%-*}。但为什么人们害怕案件陈述?您可以使用*-*)…;*)中的
case$pages消除所有额外的进程第一页=$页;lastPage=$pages;;esac
。另外,我认为您不需要“backtic echo,只要
firstPage=${pages%%-*};…
祝大家好运。感谢您的评论,@Shelleter.
而IFS=,read-r pages;do…做得很好!很好地使用了${pages%%-*}.但是为什么人们害怕案例陈述呢?你可以用*-*)中的
case$pages来消除所有额外的过程…;*)firstPage=$pages;lastPage=$pages;;esac
。另外,我认为你不需要“回溯,只要
firstPage=${pages%%-*}…”祝大家好运。感谢您的评论,@sheller。
而IFS=,read-r页面;做出于某种原因,脚本处于不受约束的循环中。我在windows上使用gawk,需要强制脚本退出。当脚本强制结束时,输出结果是正确的。有什么建议吗?谢谢!,Windows没有printf。见修订版;-)。祝您好运。您是否在Windows上使用类似unix的环境,如cygwin或Mingw(或其他),或Windows中的cmd.exe来执行此操作?祝你好运。出于某种原因,剧本在一个不受约束的循环中。我在windows上使用gawk,需要强制脚本退出。当脚本强制结束时,输出结果是正确的。有什么建议吗?谢谢!,Windows没有printf。见修订版;-)。祝您好运。您是否在Windows上使用类似unix的环境,如cygwin或Mingw(或其他),或Windows中的cmd.exe来执行此操作?祝你好运