LinuxSir.cn,穿越时空的Linuxsir!

 找回密码
 注册
搜索
热搜: shell linux mysql
12
返回列表 发新帖
楼主: hppyhjh

如何对一行数据进行整理?

[复制链接]
发表于 2007-1-11 09:54:25 | 显示全部楼层
Post by njkzkj
在有负数的情况下不行
echo "-2, 111, 101, 201-205, 300"|awk 'BEGIN{RS="[, ]*";FS="-"} {do{print $1;$1++;}while($2-$1>=0) }'                                             

1
2
111
101
201
202
203
204
205
300

其实上面其它的实现也有不行的
还有人想出什么办法呐
e,我也没考虑到负数的情况,而且还可能存在这样的行
-123--100,-40-20
再好好想想。
回复 支持 反对

使用道具 举报

发表于 2007-1-11 11:02:15 | 显示全部楼层
  1. #!/bin/bash
  2. if [ "x$1" == "x" ];then
  3.         str="-123--111,-101-0,201-205,-300-12,1,2"
  4. else
  5.         str=$1
  6. fi
  7. index=0;
  8. for i in ${str//","/" "};do
  9.         if [ `expr index $i "-"` -eq 0 ];then
  10.                 res[$index]=$i
  11.                 index=$((index+1))
  12.         else
  13.                 if [ `expr match $i '-[0-9][0-9]*--[0-9][0-9]*'` -ne 0 ];then
  14.                         low=${i%--*}
  15.                         high=${i#-*-}
  16.                         for((j = $low; j <= $high; j++));do
  17.                                 res[$index]=$j
  18.                                 index=$((index+1))
  19.                         done
  20.                         continue
  21.                 fi
  22.                 if [ `expr match $i "-[0-9][0-9]*-[0-9][0-9]*"` -ne 0 ];then
  23.                         low=${i%-*}
  24.                         high=${i##*-}
  25.                         for((j = $low; j <= $high; j++));do
  26.                                 res[$index]=$j
  27.                                 index=$((index+1))
  28.                         done
  29.                         continue
  30.                 fi
  31.                 if [ `expr match $i '[0-9][0-9]*-[0-9][0-9]*'` -ne 0 ];then
  32.                         low=${i%-*}
  33.                         high=${i#*-}
  34.                         for((j = $low; j <= $high; j++));do
  35.                                 res[$index]=$j
  36.                                 index=$((index+1))
  37.                         done
  38.                         continue
  39.                 fi
  40.         fi
  41. done
  42. echo ${res[@]}
复制代码
这回可以解决负数的问题了,就是做的比较麻烦。
回复 支持 反对

使用道具 举报

发表于 2007-1-11 22:42:20 | 显示全部楼层
楼上的, 给那么多数干嘛, 害我刷屏.
awk的


  1. awk 'BEGIN{RS="[, ]*";FS="-"} {
  2. j=1;
  3. for (i=1;i<=NF;i++){
  4. if ( ! $i ) {
  5. i++;a[j]=$i*-1;j++;
  6. }else{
  7. a[j]=$i;j++;
  8. }}
  9. if (j==2)print a[1];
  10. else if (j==3) do {
  11. print a[1];
  12. a[1]++;
  13. }while(a[2]-a[1]>=0)
  14. }'
复制代码
回复 支持 反对

使用道具 举报

发表于 2007-1-12 09:14:34 | 显示全部楼层
哈哈,有道理早知道弄个-100000000-1000000000的了
回复 支持 反对

使用道具 举报

发表于 2007-1-12 17:50:52 | 显示全部楼层

  1. /home/lee#str='123, 111, 101, 201-205, 300'
  2. /home/lee#for i in ${str//,};do [[ $i == *-* ]] && seq ${i/-/ } || echo $i;done|tr '\n' ' ';echo
  3. 123 111 101 201 202 203 204 205 300
复制代码
回复 支持 反对

使用道具 举报

发表于 2007-1-13 12:14:20 | 显示全部楼层
一个纯bash的脚本:

[PHP]
for i in  123, 111, 101, -20--5, -1, 300
do
i=${i%,}
s=${i#-}
[ "$s" == "${s//-/}" ] && echo -n $i" " \
  || \
  { [ "${s/-/}" == "${s//-/}" ] && { eval echo -n {${i%-*}..${i##*-}}; echo -n " "; } \
        ||\
         { eval echo -n {${i/--/..-}}; echo -n " "; }; \
}
done
echo
[/PHP]
回复 支持 反对

使用道具 举报

发表于 2007-1-13 22:25:41 | 显示全部楼层
不错,这个小问题集中了各路人马 :)
回复 支持 反对

使用道具 举报

 楼主| 发表于 2007-1-19 17:58:43 | 显示全部楼层
哈哈,那还不是我问题问得好.
回复 支持 反对

使用道具 举报

您需要登录后才可以回帖 登录 | 注册

本版积分规则

快速回复 返回顶部 返回列表