awk分割var两次
我想用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 -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
- 将大括号从第一个
之前移动到打印
之前,并在其所在位置放置分号拆分
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来执行此操作?祝你好运