免费注册 查看新帖 |

ChinaUnix.net

  平台 论坛 博客 文库
最近访问板块 发新帖
查看: 1405 | 回复: 7

[文本处理] 写了一个拆分文件的脚本,遇到*扩展符和readline的问题 [复制链接]

论坛徽章:
0
发表于 2016-01-20 16:47 |显示全部楼层
脚本文件如下
#!/bin/sh

#$1表示待会待搜索的字符串
#$2表示拆分位置,0表示第一个搜索字符串为拆分位置,1表示最后一个字符串为拆分位置
grep_string=$1
split_position=$2
file_name=$3
tmpline=0

#删除拆分文件
rm -f  ./split_file1
rm -f  .split_file2
echo -n > ./split_file1
echo -n >  ./split_file2

#搜索字符串在是否存在,如果不存在,就不需要拆分
#如果是拆分位置为1,统计相应字符串的行数
if  grep  $grep_string  ./$file_name >/dev/null 2>&1
then
    if [ $split_position -eq 1 ]
    then
        line_num=`grep  $grep_string  ./$file_name | wc -l`
    else
        line_num=1
    fi
else
    echo     "grep string   is not exist  so  exit"
    exit 1
fi

while  read line
do
if [ $tmpline -lt $line_num ]
then
    echo $line
    echo $line >> ./split_file1
    if  echo $line | grep $grep_string  >/dev/null 2>&1
    then
        tmpline=`expr $tmpline + 1`
    fi
else
    echo $line >> ./split_file2
fi
done  < ./$file_name

实现如下功能,就是遇到一个特定字符串,以特定字符串为分隔达到把文件拆分成两个文件的目的。
两个问题:
1 第一个问题,如果源文件的最后一行没有加换行符,read命令读不到最后一行,这个可以往文件的最后不管怎样加个换行符可以解决

2 第二个问题是如果一行是* xx的时候,这一行被写入拆分文件的时候,*就会被扩展成这个目录下的其他文件,怎么不使这个扩展可以生效呢,求解。


ps:  如果实在不行,我就用c语言实现好了。c语言不会遇到上述问题,因为c语言的fgets是判断换行或者eof的,也不会有扩展符,我觉得脚本方便,所以才
用的脚本。





论坛徽章:
130
技术图书徽章
日期:2013-10-01 15:32:13戌狗
日期:2013-10-25 13:31:35金牛座
日期:2013-11-04 16:22:07子鼠
日期:2013-11-18 18:48:57白羊座
日期:2013-11-29 10:09:11狮子座
日期:2013-12-12 09:57:42白羊座
日期:2013-12-24 16:24:46辰龙
日期:2014-01-08 15:26:12技术图书徽章
日期:2014-01-17 13:24:40巳蛇
日期:2014-02-18 14:32:59未羊
日期:2014-02-20 14:12:13白羊座
日期:2014-02-26 12:06:59
发表于 2016-01-20 21:30 |显示全部楼层
回复 1# linkejin

$ ls *
122.txt  1.txt  212.txt x.sh

$ bash x.sh "*"
122.txt 1.txt 212.txt  x.sh
*

$ cat x.sh

grep_string=$1

echo $grep_string
echo "$grep_string"


   

论坛徽章:
0
发表于 2016-01-21 09:24 |显示全部楼层
回复 2# jason680


sorry啊,其实昨天我已经试过我的代码echo  “$line” >> ./split_file1的方法,但之前怀疑我一个服务器上的samba有问题,所以一直是看的旧的结果,误以为不生效才发帖的。

!!!谢谢!!!

论坛徽章:
0
发表于 2016-01-21 09:38 |显示全部楼层
回复 2# jason680


   我又重新用c语言写了一个这个工具,浪费啊

论坛徽章:
130
技术图书徽章
日期:2013-10-01 15:32:13戌狗
日期:2013-10-25 13:31:35金牛座
日期:2013-11-04 16:22:07子鼠
日期:2013-11-18 18:48:57白羊座
日期:2013-11-29 10:09:11狮子座
日期:2013-12-12 09:57:42白羊座
日期:2013-12-24 16:24:46辰龙
日期:2014-01-08 15:26:12技术图书徽章
日期:2014-01-17 13:24:40巳蛇
日期:2014-02-18 14:32:59未羊
日期:2014-02-20 14:12:13白羊座
日期:2014-02-26 12:06:59
发表于 2016-01-21 09:43 |显示全部楼层
回复 4# linkejin

BTW, awk is simple C
   

论坛徽章:
0
发表于 2016-01-22 16:51 |显示全部楼层
回复 5# jason680
是的,awk里面可以用判断,循环,可惜不大会用。为了解决那个换行问题,我把while  read line改成了for  line  in   `awk '{print $0}' ./$file_name`,结果遇到了
*扩展符的问题。


   

论坛徽章:
130
技术图书徽章
日期:2013-10-01 15:32:13戌狗
日期:2013-10-25 13:31:35金牛座
日期:2013-11-04 16:22:07子鼠
日期:2013-11-18 18:48:57白羊座
日期:2013-11-29 10:09:11狮子座
日期:2013-12-12 09:57:42白羊座
日期:2013-12-24 16:24:46辰龙
日期:2014-01-08 15:26:12技术图书徽章
日期:2014-01-17 13:24:40巳蛇
日期:2014-02-18 14:32:59未羊
日期:2014-02-20 14:12:13白羊座
日期:2014-02-26 12:06:59
发表于 2016-01-22 17:08 |显示全部楼层
回复 6# linkejin

>> ...结果遇到了 *扩展符的问题。

都是同一个问题---shell
   

论坛徽章:
0
发表于 2016-01-22 17:13 |显示全部楼层
回复 7# jason680
是同一问题,改成这样for  line  in   "`awk '{print $0}' ./$file_name` "就好了,嘿嘿。这个“”真是万能啊
   
您需要登录后才可以回帖 登录 | 注册

本版积分规则 发表回复

基于案例的 SQL 优化实战训练营

讲师:中电福富特级专家梁敬彬,参与本次课程培训,你将收获:
1. 能编写出较为高效的 SQL;
2. 能解决70%以上的数据库常见优化问题;
3. 能得到老师提供的高效的相关工具和解决方案;
4. 能举一反三,收获不仅仅是 SQL 优化。
现在购票享受8.8折优惠!
----------------------------------------
优惠时间:2019年3月20日前

大会官网>>
  

北京盛拓优讯信息技术有限公司. 版权所有 16024965号-6 北京市公安局海淀分局网监中心备案编号:11010802020122
中国互联网协会会员  联系我们:huangweiwei@it168.com
感谢所有关心和支持过ChinaUnix的朋友们 转载本站内容请注明原作者名及出处

清除 Cookies - ChinaUnix - Archiver - WAP - TOP