LinuxSir.cn,穿越时空的Linuxsir!

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

sed求助

[复制链接]
发表于 2003-11-8 15:51:32 | 显示全部楼层 |阅读模式
1、查找第14行到最后一行有-------------*符号的,且删除-------------*下20行

2、比如文件内容如下:
--第一期-------第二期-------第三期
2003/10/01----2003/11/08----2003/11/14
1030--------2003/11/01----2003/11/01                 
2003/10/01----2003/11/08----2003/11/08                     
1033--------2003/11/02----2003/11/05                       
2003/10/02----2003/11/04----2003/11/19
1038--------2003/11/02----2003/11/08                     

查找全文 $2 $3 且$1是输入日期的那一行, 如果$2 == $3 则取本行和下一行

我说的不明白,反正结果是:
--第一期-------第二期-------第三期
2003/10/01----2003/11/08----2003/11/08                     
1033--------2003/11/02----2003/11/05  

其实我帖出来的只是文档的一小部分
                    

但有个问题就是1030那一行的$2 $3也是相等的哦,第一行也要的哦:)

帖出来的文本中有--等代表空格,为了让大家看到的是三个域:)
请执教 ,在下先拜。
发表于 2003-11-8 18:27:15 | 显示全部楼层
稍微有些??:ask
试试这个脚本如何?
文件tmp1
[/home/javalee/myshell]cat tmp1
第一期           第二期          第三期
2003/10/01       2003/11/08      2003/11/14
1030             2003/11/01      2003/11/01
2003/10/01       2003/11/08      2003/11/08
1033             2003/11/02      2003/11/05

2003/10/01       2003/11/04      2003/11/19
1038             2003/11/02      2003/11/08
2003/10/01       2003/11/08      2003/11/14
1030             2003/11/01      2003/11/01
2003/10/01       2003/11/08      2003/11/08
10223             2003/11/02      2003/11/55

2003/10/01       2003/11/04      2003/11/19
1038             2003/11/02      2003/11/08
我想你的样本文件一定很多,所以我就cp了一下,略有改动!
  1. #!/bin/ksh
  2. sed -n 1p tmp1
  3. set -A a $(cat -n tmp1|grep -v "[0-9][0-9][0-9][0-9] "|awk '$4==$3{print}'|awk '{print $1}')
  4. for i in ${a[*]}
  5. do
  6.         cat tmp1|sed -n ${i},$((i+1))p
  7. done
复制代码
就是将符号条件的行放入一个数组,再对数组进行历遍
测试结果:
第一期           第二期          第三期
2003/10/01       2003/11/08      2003/11/08
1033             2003/11/02      2003/11/05
2003/10/01       2003/11/08      2003/11/08
10223             2003/11/02      2003/11/55
发表于 2003-11-8 18:28:39 | 显示全部楼层
第一个问题你可以帖个样本文件出来吧~~ ;)
 楼主| 发表于 2003-11-9 11:57:26 | 显示全部楼层

好版主

我有好多问题都是你帮忙的,在下先谢谢了

版主用ksh用惯了?我都用bash,你的set -A的参数在bash里没有,:(
正在学习第二个问题。。。。

第一个问题就是

我要的表头
---------------

dfdf
876546
)()sdfsdf

正文1
正文2

---------------
   
jhj
gh
lklk

正文3

---------------





。表示略了,N个,我要的是正文,也就是说,把---------下五行的删除,
得到的结果是:
我要的表头
正文1
正文2
正文3
 楼主| 发表于 2003-11-9 12:26:18 | 显示全部楼层
有问题我不明白:ask
#!/bin/ksh
sed -n 1p tmp1
set -A a $(cat -n tmp1|grep -v "[0-9][0-9][0-9][0-9] "|awk '$4==$3{print}'|awk '{print $1}')
for i in ${a
  • }
    do
            cat tmp1|sed -n ${i},$((i+1))p
    done


    第一行取出‘表头’
    由于set -A我不清楚,略过,grep -v 四个数字,先掠过第二行,先只取都是日期的那行,意思应该是符合条件的,输出$1的日期
    for以后的,如果变量i在符合条件的$1里,就输出本行和下面一行,
    不知有没有曲解版主的意思

    Q1;set -A 是要设置a???
    Q2:grep -v只有四个数字,但你cp的样本里有五个数字的,如果没有过滤,
       而$2,$3的日期又一样岂不是会乱?
    Q3:为何会有$4呢?

    望版主给在下讲解一下:thank
  • 发表于 2003-11-9 12:55:26 | 显示全部楼层
    是这样的吗?
    [/home/javalee/myshell]cat urfile
    我要的表头
    ---------------

    dfdf
    876546
    )()sdfsdf

    正文1
    正文2

    ---------------

    jhj
    gh
    lklk

    正文3
    正文4

    ---------------

    ---------------

    dfdf
    876546
    )()sdfsdf

    正文1
    正文2

    ---------------

    jhj
    gh
    lklk

    正文3
    正文4

    ---------------

    [/home/javalee/myshell]cat ur
    1. #!/bin/ksh
    2. set -A line $(grep -n "-" urfile|cut -f1 -d":")
    3. for i in ${line[*]}
    4. do
    5.         cat urfile|sed -n ${i},$((i+5))p
    6. done>a
    7. diff a urfile|grep ">"|tr -d "> "|tr -s "\n"
    复制代码
    [/home/javalee/myshell]ksh ur  #执行脚本
    我要的表头
    正文1
    正文2
    正文3
    正文4
    正文1
    正文2
    正文3
    正文4
    [/home/javalee/myshell]
    发表于 2003-11-9 13:03:09 | 显示全部楼层
    最初由 battosai 发表
    有问题我不明白:ask
    #!/bin/ksh
    sed -n 1p tmp1
    set -A a $(cat -n tmp1|grep -v "[0-9][0-9][0-9][0-9] "|awk '$4==$3{print}'|awk '{print $1}')
    for i in ${a
  • }
    do
            cat tmp1|sed -n ${i},$((i+1))p
    done


    第一行取出‘表头’
    由于set -A我不清楚,略过,grep -v 四个数字,先掠过第二行,先只取都是日期的那行,意思应该是符合条件的,输出$1的日期
    for以后的,如果变量i在符合条件的$1里,就输出本行和下面一行,
    不知有没有曲解版主的意思

    Q1;set -A 是要设置a???
    Q2:grep -v只有四个数字,但你cp的样本里有五个数字的,如果没有过滤,
       而$2,$3的日期又一样岂不是会乱?
    Q3:为何会有$4呢?

    望版主给在下讲解一下:thank

  • 1,set -A 是ksh建立数组的关键字,后面的a是数组名,在bash中可以用a=(1 2 3...)这样的形式,具体如何建立数组,请搜索一下咱们版
    2,因为四个数子后面还有 一个空格
    3,$4是因为用了cat -n这个选项, 他产生了行号
     楼主| 发表于 2003-11-9 16:18:33 | 显示全部楼层

    还有问题


    set -A a $(cat -n tmp1|grep -v "[0-9][0-9][0-9][0-9] "|awk '$4==$3{print}'|awk '{print $1}')

    我代替为tmp1=`cat -n tmp1|grep -v "[0-9][0-9][0-9][0-9] "|awk '$4==$3{print}'|awk '{print $1}'`

    在vi环境下1,$g/^------------/d5  可以删除以------------开头的行且一下五行,但用在sed上我就不会用了,不知道版主还有更简单的sed方法没有?
    发表于 2003-11-9 17:59:52 | 显示全部楼层

    回复: 还有问题

    最初由 battosai 发表

    set -A a $(cat -n tmp1|grep -v "[0-9][0-9][0-9][0-9] "|awk '$4==$3{print}'|awk '{print $1}')

    我代替为tmp1=`cat -n tmp1|grep -v "[0-9][0-9][0-9][0-9] "|awk '$4==$3{print}'|awk '{print $1}'`

    在vi环境下1,$g/^------------/d5  可以删除以------------开头的行且一下五行,但用在sed上我就不会用了,不知道版主还有更简单的sed方法没有?


    我对sed也是一知半解,可以查看一下手册吧~~ :sorry
     楼主| 发表于 2003-11-10 09:50:33 | 显示全部楼层

    版主

    在chinaunix的一个人给了我另外的一种思路,但是sed 删除行变量的时候有问题,
    我贴出来你看一下,请执教


    1. Num=`sed -n /^----/= myfile`
    2. for i in $Num
    3. do
    4. l=`expr $i + 22`
    5. cat myfile |sed '$i,$ld'  >okok
    6. done
    复制代码


    这里是删除以---开头的行和下22行
    您需要登录后才可以回帖 登录 | 注册

    本版积分规则

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