免费注册 查看新帖 |

Chinaunix

  平台 论坛 博客 文库
最近访问板块 发新帖
查看: 4673 | 回复: 8
打印 上一主题 下一主题

[文本处理] 向大家请教个文件过滤性删除的问题 [复制链接]

论坛徽章:
0
跳转到指定楼层
1 [收藏(0)] [报告]
发表于 2013-09-24 16:23 |只看该作者 |倒序浏览
大家好,我的问题是这样的,我又一个1.txt文件内容如下:

系统数据文件[test1.txt]
信息[1] 123
信息[2] 124
信息[1] 5678
信息[2] 5632

系统数据文件[test2.txt]
信息[1] 9876
信息[2] 6542
信息[1] 1678
信息[2] 9092

我希望将删除"信息[2]“的内容将文件变为

系统数据文件[test1.txt]
信息[1] 123
信息[1] 5678

系统数据文件[test2.txt]
信息[1] 9876
信息[1] 1678

我的机器是AIX ksh
个人查找资料后觉得有两种方法可行
1、循环读取文件内容,对每行信息进行比较;目前卡在不会串的比较上,说用
4.字符串替换

[chengmo@localhost ~]$ test='c:/windows/boot.ini'
[chengmo@localhost ~]$
echo ${test/\//\\}
c:\windows/boot.ini
[chengmo@localhost ~]$ echo
${test//\//\\}
c:\windows\boot.ini
${变量/查找/替换值} 一个“/”表示替换第一个,”//”表示替换所有,当查找中出现了:”/”请加转义符”\/”表示。

但是我实验后,发现不成
$ export test='c:/windows/boot.ini'
$ echo ${test/\//\\}               
ksh: ${test/\//\\}: 0403-011 The specified substitution is not valid for this command.

2、方法二,使用sed 删除,但是我实验了网上例子,都没有成功;

大家帮我看看,怎么搞好,谢谢!


论坛徽章:
50
15-16赛季CBA联赛之广夏
日期:2018-11-05 09:42:462015年亚冠纪念徽章
日期:2015-07-23 11:58:122015亚冠之广州富力
日期:2015-07-07 08:26:172015亚冠之塔什干棉农
日期:2015-06-29 09:08:072015年亚洲杯之伊朗
日期:2015-03-08 20:51:012015年迎新春徽章
日期:2015-03-04 09:58:11未羊
日期:2014-10-16 22:41:47处女座
日期:2014-10-16 15:33:33酉鸡
日期:2014-03-13 12:54:10巳蛇
日期:2014-03-10 14:39:052015亚冠之德黑兰石油
日期:2015-07-29 12:46:372015亚冠之德黑兰石油
日期:2015-08-07 12:54:11
2 [报告]
发表于 2013-09-24 16:33 |只看该作者
  1. sed -i '/信息\[2\]/d' file
复制代码

论坛徽章:
0
3 [报告]
发表于 2013-09-24 16:40 |只看该作者
ok,这个方法可以,我是AIX没有-i参数,刚才原来卡在这里了,谢谢楼上,不过还想问问大家,如果我使用如下的方式
#!/bin/sh
while read line
do
        echo $line;
done <1.txt

如何判断$line中判断包含了“信息[2]”?

论坛徽章:
1
数据库技术版块每日发帖之星
日期:2016-02-25 06:20:00
4 [报告]
发表于 2013-09-24 16:50 |只看该作者
回复 3# snakedy


    grep一下不就行了?
  1. while read line
  2. do
  3.     if ! echo $line | grep -q '信息\[2\]';then
  4.         echo $line
  5.     fi
  6. done < 1.txt
复制代码

论坛徽章:
1
数据库技术版块每日发帖之星
日期:2016-02-25 06:20:00
5 [报告]
发表于 2013-09-24 17:03 |只看该作者
回复 1# snakedy

    用sed是可以的吧?
  1. linux:~ # cat file.sh
  2. #!/bin/ksh

  3. test='c:/windows/boot.ini'
  4. echo $test | sed 's#/#\\#g'
  5. linux:~ # ksh file.sh
  6. c:\windows\boot.ini
复制代码

论坛徽章:
0
6 [报告]
发表于 2013-09-24 17:06 |只看该作者
恩,用sed没有问题,我只是想扩展一下问题,我想在用for循环读取文件的方法解决这个问题,但是对读取的一行数据中的子串判断不是很了解,所以请教一下大家

论坛徽章:
33
ChinaUnix元老
日期:2015-02-02 08:55:39CU十四周年纪念徽章
日期:2019-08-20 08:30:3720周年集字徽章-周	
日期:2020-10-28 14:13:3020周年集字徽章-20	
日期:2020-10-28 14:04:3019周年集字徽章-CU
日期:2019-09-08 23:26:2519周年集字徽章-19
日期:2019-08-27 13:31:262016科比退役纪念章
日期:2022-04-24 14:33:24
7 [报告]
发表于 2013-09-25 09:54 |只看该作者
回复 4# xiaoshichao143

用grep的话,while循环就可以去掉了。
  1. grep -v '信息\[2\]' a.txt > b.txt
复制代码

论坛徽章:
33
ChinaUnix元老
日期:2015-02-02 08:55:39CU十四周年纪念徽章
日期:2019-08-20 08:30:3720周年集字徽章-周	
日期:2020-10-28 14:13:3020周年集字徽章-20	
日期:2020-10-28 14:04:3019周年集字徽章-CU
日期:2019-09-08 23:26:2519周年集字徽章-19
日期:2019-08-27 13:31:262016科比退役纪念章
日期:2022-04-24 14:33:24
8 [报告]
发表于 2013-09-25 10:00 |只看该作者
回复 6# snakedy


方法是这样的,看看你的AIX是否支持吧。
  1. while read line; do
  2.     if ! [[ $line =~ "信息\[2\]" ]]; then
  3.         echo $line
  4.     fi
  5. done < urfile
复制代码

论坛徽章:
36
摩羯座
日期:2013-09-23 16:37:312015年亚洲杯之沙特阿拉伯
日期:2015-04-14 09:10:172015亚冠之柏太阳神
日期:2015-06-25 08:48:212015亚冠之武里南联
日期:2015-07-28 09:01:082015亚冠之莱赫维亚
日期:2015-07-28 15:44:172015亚冠之柏斯波利斯
日期:2015-09-06 14:08:52白银圣斗士
日期:2015-11-25 17:06:2815-16赛季CBA联赛之吉林
日期:2015-12-09 16:59:072016猴年福章徽章
日期:2016-02-18 15:30:3415-16赛季CBA联赛之辽宁
日期:2016-04-14 09:29:04luobin
日期:2016-06-17 17:46:3615-16赛季CBA联赛之天津
日期:2016-08-16 14:11:01
9 [报告]
发表于 2013-09-25 14:47 |只看该作者
awk '!/\[2\]/{print $0}'   不知道aix支持不
您需要登录后才可以回帖 登录 | 注册

本版积分规则 发表回复

  

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

清除 Cookies - ChinaUnix - Archiver - WAP - TOP