我想用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
答案 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
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