LinuxSir.cn,穿越时空的Linuxsir!

 找回密码
 注册
搜索
热搜: shell linux mysql
查看: 1695|回复: 17

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

[复制链接]
发表于 2007-1-10 10:26:03 | 显示全部楼层 |阅读模式
比如有一行内容:

123, 111, 101, 201-205, 300

如何将其整理为:

123 111 101 201 202 203 204 205 300

谢谢!
发表于 2007-1-10 11:06:00 | 显示全部楼层
  1. #!/bin/bash
  2. if [ "x$1" == "x" ];then
  3.         str="123,111,101,201-205,300"
  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.                 low=${i%-*}
  14.                 high=${i#*-}
  15.                 for((j = $low; j <= $high; j++));do
  16.                         res[$index]=$j
  17.                         index=$((index+1))
  18.                 done;
  19.         fi
  20. done
  21. echo ${res[@]}
复制代码
回复 支持 反对

使用道具 举报

发表于 2007-1-10 12:44:23 | 显示全部楼层

  1. #!/bin/bash
  2. str="123, 111, 101, 201-205, 300"
  3. str=$( echo $str | sed 's/,//g' )
  4. headstr=$( echo $str |awk '{print $1,$2,$3}')
  5. midstr=$(echo $str|awk '{print $4}')
  6. tailstr=$(echo $str|awk '{print $5}')
  7. m=$(echo $midstr|awk -F\- '{print $1}')
  8. n=$(echo $midstr|awk -F\- '{print $2}')
  9. while [ $m -le $n ]
  10. do
  11.         joinstr=$(echo -n $joinstr && echo -n " $m")
  12.         ((m++))
  13. done
  14. str=$(echo $str|sed "s/$midstr/$joinstr/g")
  15. echo $str
复制代码
回复 支持 反对

使用道具 举报

发表于 2007-1-10 13:34:26 | 显示全部楼层
如果不介意我把数字顺序打乱的话
  1. prayaya@prayaya:~$ echo 123, 111, 101, 201-205, 300, 1-3 | perl -pe 's/,//g; s/(\d+)-(\d+)/print "$_ " for ($1..$2)/eg'
  2. 201 202 203 204 205 1 2 3 123 111 101  300
  3. prayaya@prayaya:~$
复制代码
回复 支持 反对

使用道具 举报

发表于 2007-1-10 14:21:43 | 显示全部楼层
Post by grassofhust

  1. #!/bin/bash
  2. str="123, 111, 101, 201-205, 300"
  3. str=$( echo $str | sed 's/,//g' )
  4. headstr=$( echo $str |awk '{print $1,$2,$3}')
  5. midstr=$(echo $str|awk '{print $4}')
  6. tailstr=$(echo $str|awk '{print $5}')
  7. m=$(echo $midstr|awk -F\- '{print $1}')
  8. n=$(echo $midstr|awk -F\- '{print $2}')
  9. while [ $m -le $n ]
  10. do
  11.         joinstr=$(echo -n $joinstr && echo -n " $m")
  12.         ((m++))
  13. done
  14. str=$(echo $str|sed "s/$midstr/$joinstr/g")
  15. echo $str
复制代码
对格式的要求过于严厉了些。
回复 支持 反对

使用道具 举报

发表于 2007-1-10 19:10:40 | 显示全部楼层
Post by Iambitious
对格式的要求过于严厉了些。
谢谢提醒。
  1. #!/bin/bash
  2. str="123, 111, 101, 201-205, 300"
  3. str=$( echo $str | sed 's/,//g' )
  4. m=1;bool=1
  5. while [ $bool -ne 0 ]
  6. do
  7.     targetstr=`echo $str | cut -d" " -f"$m"`
  8.     ((m++))
  9.     if echo $targetstr | grep "..*-..*" > /dev/null 2>&1 ; then
  10.         bool=0
  11.     fi
  12. done
  13. i=`echo $targetstr|cut -d- -f1`
  14. j=`echo $targetstr|cut -d- -f2`
  15. while [ $i -le $j ]
  16. do
  17.         joinstr=$(echo -n $joinstr && echo -n " $i")
  18.         ((i++))
  19. done
  20. str=$(echo $str|sed "s/$targetstr/$joinstr/g")
  21. echo $str
复制代码
回复 支持 反对

使用道具 举报

发表于 2007-1-10 20:43:54 | 显示全部楼层

using perl

$ cat test.pl
#!/usr/bin/perl
$lists=$ARGV[0];
$lists=~ s/-/../g;
eval ( "print join (\" \",($lists))");
回复 支持 反对

使用道具 举报

发表于 2007-1-10 22:09:24 | 显示全部楼层
echo "123, 111, 101, 201-205, 300"|awk 'BEGIN{RS="[, ]*";FS="-"} {do{print $1;$1++;}while($2-$1>=0) }'
回复 支持 反对

使用道具 举报

发表于 2007-1-11 09:08:42 | 显示全部楼层
Post by lastart
echo "123, 111, 101, 201-205, 300"|awk 'BEGIN{RS="[, ]*";FS="-"} {do{print $1;$1++;}while($2-$1>=0) }'

在有负数的情况下不行
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

其实上面其它的实现也有不行的
还有人想出什么办法呐
回复 支持 反对

使用道具 举报

发表于 2007-1-11 09:50:31 | 显示全部楼层
Post by grassofhust
谢谢提醒。
  1. #!/bin/bash
  2. str="123, 111, 101, 201-205, 300"
  3. str=$( echo $str | sed 's/,//g' )
  4. m=1;bool=1
  5. while [ $bool -ne 0 ]
  6. do
  7.     targetstr=`echo $str | cut -d" " -f"$m"`
  8.     ((m++))
  9.     if echo $targetstr | grep "..*-..*" > /dev/null 2>&1 ; then
  10.         bool=0
  11.     fi
  12. done
  13. i=`echo $targetstr|cut -d- -f1`
  14. j=`echo $targetstr|cut -d- -f2`
  15. while [ $i -le $j ]
  16. do
  17.         joinstr=$(echo -n $joinstr && echo -n " $i")
  18.         ((i++))
  19. done
  20. str=$(echo $str|sed "s/$targetstr/$joinstr/g")
  21. echo $str
复制代码
这个代码对于1-3,4-6,7-9这样的行,无法进行有效的处理。
回复 支持 反对

使用道具 举报

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

本版积分规则

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