免费注册 查看新帖 |

Chinaunix

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

如何求每行第4个字符到第8个字符之间的字符 并与给定的字符比较? [复制链接]

论坛徽章:
0
跳转到指定楼层
1 [收藏(0)] [报告]
发表于 2008-10-30 20:55 |只看该作者 |倒序浏览
10可用积分
如何求每行第4个字符到第8个字符之间的字符 并与给定的字符比较?如果不相等则继续!

用sed 或者awk

最佳答案

查看完整内容

是检查某列数字是否递增?可以拿NR当标杆和他比。以下仅针对你的样本如果system内的命令只跑一次就换成

论坛徽章:
0
2 [报告]
发表于 2008-10-30 20:55 |只看该作者
原帖由 lusanchao 于 2008-10-31 07:42 发表
不好意思,问题没说清楚。如这样的文档:
tid:1 fdsf
tid:2 gdasg
tid:4 gdgdg
tid:5 gdasg
....

主要是想找出文件中没有的数字,如到第三行,发现不是3,则处理脚本中下面的命令



是检查某列数字是否递增?可以拿NR当标杆和他比。以下仅针对你的样本
  1. awk -F"[: ]"+ 'BEGIN{a=0}{while(NR<$2-a){a++;system("sh xx.sh")}}'
复制代码


如果system内的命令只跑一次就换成
  1. awk -F"[: ]"+ 'BEGIN{a=0}{if(NR<$2-a){a=$2-NR;system("sh xx.sh")}}'
复制代码

论坛徽章:
0
3 [报告]
发表于 2008-10-30 21:15 |只看该作者
awk '{if(substr($0,4,5)!~/xx/)...}' file

xx=给定字符...是你继续要干什么。

最好需求再详细点,不相等继续,相等呢?强制退出?

论坛徽章:
23
15-16赛季CBA联赛之吉林
日期:2017-12-21 16:39:27白羊座
日期:2014-10-27 11:14:37申猴
日期:2014-10-23 08:36:23金牛座
日期:2014-09-30 08:26:49午马
日期:2014-09-29 09:40:16射手座
日期:2014-11-25 08:56:112015年辞旧岁徽章
日期:2015-03-03 16:54:152015年迎新春徽章
日期:2015-03-04 09:49:0315-16赛季CBA联赛之山东
日期:2017-12-21 16:39:1915-16赛季CBA联赛之广东
日期:2016-01-19 13:33:372015亚冠之山东鲁能
日期:2015-10-13 09:39:062015亚冠之西悉尼流浪者
日期:2015-09-21 08:27:57
4 [报告]
发表于 2008-10-30 21:51 |只看该作者
sed -n '/...xxxx/!p'
awk '!/...xxxx/'

论坛徽章:
0
5 [报告]
发表于 2008-10-30 22:13 |只看该作者
awk '{if (match(substr($0,4,,"XX") ....}'

看看行不行

论坛徽章:
1
处女座
日期:2014-12-23 17:59:27
6 [报告]
发表于 2008-10-30 22:20 |只看该作者
原帖由 ly5066113 于 2008-10-30 21:51 发表
sed -n '/...xxxx/!p'
awk '!/...xxxx/'

没有高手是天生的, 假如想成为 Tim 这样的高手, 得要比 Tim 努力才行.
Tim 每天花在 Shell 版的时间 至少得 5h吧.

向 Tim 学习.

论坛徽章:
0
7 [报告]
发表于 2008-10-30 22:31 |只看该作者
我的理解:
以下列文件为例:
12345678aaa
1111xxxxxlll
xxxxxxxxxxxxx
1234abcdllllll
xxxxkkkkkkkkk
aaaaabcdjjjjjj


给定的字符为abcd,我觉得以下的答案比较符合楼主的需求:
sed -e '/....abcd/q' t1

执行完的结果如下:
12345678aaa
1111xxxxxlll
xxxxxxxxxxxxx
1234abcdllllll

只要碰到4-8位的字符是abcd就退出了。

如果最后的输出要的是4-8个字符,可写成如下:
sed -e '/....abcd/q' t1|cut -c4-8
执行完的结果如下:
45678
1xxxx
xxxxx
4abcd

如果楼主要符合条件的第一行,可写成如下:
sed -n '/....abcd/{p;q}' t1
执行完的结果如下:
1234abcdllllll


就像2楼所说,需求要详细一些就好了。不过我理解,q命令是必不可少的。一家之言,仅供参考。

论坛徽章:
1
荣誉会员
日期:2011-11-23 16:44:17
8 [报告]
发表于 2008-10-30 23:43 |只看该作者
是这样的意思吧
str=xxxxx
while read line; do
[[ ${line:3:5} ==  $str ]] && cmd1 || cmd2
done < input-file

论坛徽章:
0
9 [报告]
发表于 2008-10-30 23:56 |只看该作者

回复 #7 寂寞烈火 的帖子

前半句是每行,所以应该是文本,后半句是如果不等则继续,感觉又是在跑命令……

论坛徽章:
0
10 [报告]
发表于 2008-10-31 00:34 |只看该作者
原帖由 寂寞烈火 于 2008-10-30 23:43 发表
是这样的意思吧
str=xxxxx
while read line; do
[[ ${line:3:5} ==  $str ]] && cmd1 || cmd2
done < input-file


呵呵,我也是这样理解的
LZ是想继续跑命令吗? 还是.......
您需要登录后才可以回帖 登录 | 注册

本版积分规则 发表回复

  

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

清除 Cookies - ChinaUnix - Archiver - WAP - TOP