Chinaunix

标题: 求救一个shell问题,查了2天没解决!!!! [打印本页]

作者: ssxy    时间: 2009-05-19 17:49
标题: 求救一个shell问题,查了2天没解决!!!!
一个数据文件如下:
13307340002|460030947241081|
13307340003|460030907346935|
13307340004|460030907340287|
        13307340005
13307340005|460030907340292|
13307340006|460030917476624|
        13307340007
13307340007|460030937341568|


我要打印出:
13307340005|460030907340292|
13307340007|460030937341568|

我的一个思路就是判断有大空格"        ",就打印它的下一行

可是不知道怎么能只输出它的下一行,郁闷,请高手指点一下!
作者: kwokcn    时间: 2009-05-19 17:49
如果确定你提供的例子和我们所看到的一样是分行的,那尝试一下这个:


  1. sed -n '/^[ \t]/{n;p}' URFILE
复制代码

作者: yy_galois    时间: 2009-05-19 17:54
sed -n -e '/    /{n;p}'  num.txt

n    Read the next line of input into the pattern space.

N   Append the next line of input into the pattern space.

[ 本帖最后由 yy_galois 于 2009-5-19 17:55 编辑 ]
作者: ssxy    时间: 2009-05-19 17:59
p 后面有;号吧?

不过还是打印不出来
作者: aboy11    时间: 2009-05-19 18:00
换个思路,把有空行的删掉,不知是否符合你的需求。。
作者: yy_galois    时间: 2009-05-19 18:01
标题: 回复 #3 ssxy 的帖子
没有;号。

我这边打印出来了。
作者: ssxy    时间: 2009-05-19 18:03
原帖由 aboy11 于 2009-5-19 18:00 发表
换个思路,把有空行的删掉,不知是否符合你的需求。。



不行啊,
13307340002|460030947241081|
13307340003|460030907346935|

这种数据也会留下的
作者: ssxy    时间: 2009-05-19 18:04
原帖由 yy_galois 于 2009-5-19 18:01 发表
没有;号。

我这边打印出来了。



是吗? 奇怪
作者: aboy11    时间: 2009-05-19 18:05
我理解错了

  1. awk '/ +/{getline;print}' urfile
复制代码

作者: steel_lei    时间: 2009-05-19 18:05
$ grep -A 1 "^ " ufile | sed -e '/--/d' | sed '/^ /d'
13307340005|460030907340292|
13307340007|460030937341568|
作者: ssxy    时间: 2009-05-19 18:08
原帖由 steel_lei 于 2009-5-19 18:05 发表
$ grep -A 1 "^ " ufile | sed -e '/--/d' | sed '/^ /d'
13307340005|460030907340292|
13307340007|460030937341568|



??

grep -A 1 "^ " hhyy | sed -e '/--/d' | sed '/^ /d'

我得文件是hhyy, 打印不出来啊

"^ "  和 sed '/^ /d'

两个^后面是大空格吧?
作者: ssxy    时间: 2009-05-19 18:09
sed -e '/--/d'

做什么用的?
作者: steel_lei    时间: 2009-05-19 18:12
标题: 回复 #10 ssxy 的帖子
是空格
作者: steel_lei    时间: 2009-05-19 18:12
$ sed -n '/^ /{N;p;}' ufile | sed '/^ /d'               
13307340005|460030907340292|
13307340007|460030937341568|
作者: steel_lei    时间: 2009-05-19 18:13
原帖由 ssxy 于 2009-5-19 18:09 发表
sed -e '/--/d'

做什么用的?

删除含有--的行
作者: ssxy    时间: 2009-05-19 18:16
晕死,各位给的,我怎么一个也跑不出来数据呢??
作者: kwokcn    时间: 2009-05-19 18:18
楼主能否把需求说的更明白点呢?根据你前面的描述,我看到了好几个符合你的要求的语句了。
作者: ssxy    时间: 2009-05-19 18:20
需求就是我描述的那样啊,可是我怎么跑不出来?

各位给的这些命令,都是可以在命令行直接执行的吗?
作者: kwokcn    时间: 2009-05-19 18:32
我估计,那个“大空格”是制表符……
作者: ssxy    时间: 2009-05-19 18:34
原帖由 kwokcn 于 2009-5-19 18:30 发表
如果确定你提供的例子和我们所看到的一样是分行的,那尝试一下这个:


sed -n '/^[ \t]/{n;p}' URFILE




哦,my god, 亲人啊,这个我能跑出来的,多谢多谢,我对你的敬仰..........
作者: kwokcn    时间: 2009-05-19 18:36
果然是制表符的问题,嘿嘿~:)
作者: ssxy    时间: 2009-05-19 18:44
怎么给分啊,小弟只有8分,别闲少啊,呵呵
作者: ssxy    时间: 2009-05-19 18:44
有shell 和perl的书吗,小弟初学
作者: kwokcn    时间: 2009-05-19 18:57
shell的书在这个版块有很多帖子提起了,可以通过上面的搜索功能找一下。Advanced Bash-Scripting Guide 、UNIX Shell 范例精解、O'Reilly sed&awk等等都很好。
perl的我也在找呢,准备有时间也看看。:)
作者: ssxy    时间: 2009-05-19 18:58
多谢了
作者: ssxy    时间: 2009-05-19 19:24
如果那行数据前面没有空格,怎么找出这下一行呢?
作者: kwokcn    时间: 2009-05-19 19:34

  1. awk -F\| 'NF==1{getline;print}' URFILE
复制代码

作者: ssxy    时间: 2009-05-19 19:38
可以了,

awk -F\| 'NF==1

这是不是表示以“|”为分隔符,如果只有1列,就...下面getline 是取下一列?
作者: ssxy    时间: 2009-05-19 20:01
如果有2个文件: aa 和 bb

怎么比较他们,去除aa中含有的bb的行数据,就是aa-bb

数据格式都是这样的
15348480436|460036480458435|
15348480437|460036480458436|
作者: ssxy    时间: 2009-05-19 20:02
comm -23 并不好使
作者: kwokcn    时间: 2009-05-19 20:04
原帖由 ssxy 于 2009-5-19 19:38 发表
可以了,

awk -F\| 'NF==1

这是不是表示以“|”为分隔符,如果只有1列,就...下面getline 是取下一列?

以"|"为分隔符,如果只有一列,则取下一行输出。
作者: kwokcn    时间: 2009-05-19 20:05
原帖由 ssxy 于 2009-5-19 20:01 发表
如果有2个文件: aa 和 bb

怎么比较他们,去除aa中含有的bb的行数据,就是aa-bb

数据格式都是这样的
15348480436|460036480458435|
15348480437|460036480458436|

  1. awk 'NR==FNR{a[$0]++}NR>FNR&&!a[$0]' bb aa
复制代码

作者: ssxy    时间: 2009-05-19 20:10
多谢,今天你是我师傅
作者: 可恶的    时间: 2009-05-20 09:28
为防止\t的情况,可以用\s代替,这样比较河蟹。
作者: ssxy    时间: 2009-05-20 18:15
求教新问题:
合并2个文件 aa  bb

数据格式都是这样的
15348480436|460036480458435|
15348480437|460036480458436|

要求重复的行,只保留一行,怎么写呢?
时间紧,还不能举一反三啊,谢谢!
作者: kwokcn    时间: 2009-05-20 18:31
不要求排序:

  1. awk '!a[$0]++' aa bb
复制代码


要求排序:

  1. sort -u aa bb
复制代码

[ 本帖最后由 kwokcn 于 2009-5-20 19:09 编辑 ]
作者: ssxy    时间: 2009-05-20 18:39
会者不难啊
作者: w80286    时间: 2009-05-20 19:22
标题: 回复 #37 ssxy 的帖子
这就是linux,shell的强大之处吧!
新手同样漂过.....
作者: tbocd    时间: 2009-05-20 23:36
原帖由 kwokcn 于 2009-5-19 17:49 发表
如果确定你提供的例子和我们所看到的一样是分行的,那尝试一下这个:


sed -n '/^[ \t]/{n;p}' URFILE

\t有什么用?
作者: tbocd    时间: 2009-05-20 23:49
原帖由 kwokcn 于 2009-5-19 20:04 发表

以"|"为分隔符,如果只有一列,则取下一行输出。

练习之,实现之:
awk -F\| 'NF==1 {getline var;print var} ' file
作者: kwokcn    时间: 2009-05-21 00:41
原帖由 tbocd 于 2009-5-20 23:36 发表

\t有什么用?

就是制表符啊~
像"       13307340005"这种行,如果提问者不明确是空格还是制表符,那么用[ \t]+来表示应该是最合适的,即一个或多个空格,或者一个或多个制表符。因为这儿可能是空格,也可能是制表符……很绕口…… >_<
作者: peterpan_4_ever    时间: 2009-05-21 08:47
学习了,谢谢

[ 本帖最后由 peterpan_4_ever 于 2009-5-21 08:48 编辑 ]
作者: hoodo    时间: 2009-05-21 10:24
标题: 我比较老实,写的很烂,但是可以得到结果,lz自己优化下
cat 1.txt  |awk -F'|' '{if ($1~/[0-9]*5$/ || $1~ /[0-9]*7$/) print  $0}'  | sed  ' 1d'  |sed '2d'
作者: hoodo    时间: 2009-05-21 10:28
标题: 回复 #39 tbocd 的帖子
还是先看sed的n 用法吧!
作者: hoodo    时间: 2009-05-21 10:33
标题: 回复 #1 ssxy 的帖子
各位大侠的方法我看了下
debian:/home/wanghao/practice# time awk '/ +/{getline;print}' 1.txt
13307340005|460030907340292|
13307340007|460030937341568|

real    0m0.003s
user    0m0.000s
sys     0m0.000s
debian:/home/wanghao/practice# time cat 1.txt  |awk -F'|' '{if ($1~/[0-9]*5$/ || $1~ /[0-9]*7$/) print  $0}'  | sed  ' 1d'  |sed '2d'
13307340005|460030907340292|
13307340007|460030937341568|

real    0m0.010s
user    0m0.000s
sys     0m0.008s
debian:/home/wanghao/practice# time sed -n '/^[ \t]/{n;p}' 1.txt
13307340005|460030907340292|
13307340007|460030937341568|

real    0m0.003s
user    0m0.000s
sys     0m0.000s
debian:/home/wanghao/practice#
作者: smz0102    时间: 2009-05-21 15:57
sed -n '/^  /{n;p}' file

[ 本帖最后由 smz0102 于 2009-5-21 16:26 编辑 ]
作者: sunying874    时间: 2009-05-21 16:27
给他品人vgfae飞
作者: 可恶的    时间: 2009-05-22 09:23
sed -n '/^\s\{2,\}/N;/111/p;D'|sed '/^\s\{2,\}/d'

貌似这个可以解决连续两个的问题,但不知道是否有更精简的写法。
作者: ubuntuer    时间: 2009-05-22 12:40
  1. sed -n '/|/!{n;p}' txt
复制代码

作者: lrz    时间: 2009-05-22 18:50
grep -A 1 "^ " ufile | tail -1
盗用一下steel_lei 的grep
作者: greendays    时间: 2009-05-24 10:38
标题: 回复 #1 ssxy 的帖子
grep -EA1 '^[ \t]+' urfile | sed -r '/^[- ]/d'
作者: prc    时间: 2009-05-25 14:02

  1. gawk --re-interval -- '
  2. $1~/^[0-9]{11}$/ { current=$1; next }
  3. { split($1,a,"|"); if(a[1]==current) print $1; current=-1; }
  4. '
复制代码





欢迎光临 Chinaunix (http://bbs.chinaunix.net/) Powered by Discuz! X3.2