Chinaunix

标题: [求助]awk sed 比较上下两行,编辑筛选文本 [打印本页]

作者: foolboy007    时间: 2006-10-21 09:24
标题: [求助]awk sed 比较上下两行,编辑筛选文本
有这样的200多行数据
0                         0            0.00495
0.0785127        0.008        0.00494832
0                            0             0.00485
0.0272399               0.008       0.00483753
0.027245                         0.008      0.00483778
0                            0             0.00475
0.0177068               0.008       0.00473023
0                              0              0.00465
0.0137481        0.008        0.00462319
0                              0              0.00455
0.0116907        0.008        0.00451633
0.0116907        0.008        0.00451633
0                              0              0.00445
0.0104969        0.008        0.00441127
0.0104969        0.008        0.00441127
0                              0               0.00435
0.00975669        0.008        0.00430657
0.00975669        0.008        0.00430657
0                              0               0.00165
0.00823954        0.008        0.00162989
0.00824105        0.008        0.00163029
0                              0               0.00155
0.00822567        0.008        0.00153088
0                              0               0.00145
0.00821271        0.008        0.00143223


第二列值为0.008的紧挨着的两条记录只要第二条 删除上面的一行
最后形成 这样的数据
0                              0              0.00495
0.0785127        0.008        0.00494832
0                               0             0.00485
0.027245                         0.008      0.00483778
0                              0              0.00475
0.0177068               0.008       0.00473023
0                              0              0.00465
0.0137481        0.008        0.00462319
0                              0              0.00455
0.0116907        0.008        0.00451633
0                              0              0.00445
0.0104969        0.008        0.00441127
.....
......

能用awk筛选出来么??
或者导入到数据库里面 用SQL  求个位帮忙
作者: qqq112233g    时间: 2006-10-21 11:26
试试这个行不行:

  1. sed -n 'H;${g;s/[^\n]*0\.008[^\n]*\n\(0\.[^\n]*\)/\1/g;p}' file
复制代码

作者: qqq112233g    时间: 2006-10-21 11:41
呵呵,我觉得说明一下比较好,这样清楚一点!
希望大家指正:我的思想是把先把所有行读成一行,取出两个\n之间包含0.008的字符串,这两个\n之间不再包含\n(即没有把所有行读成一行时含有0.008的行),再判断下一字符串是否是以“0.”字串开头的,是的话用以0.开头的到最近一个\n之间的字符串取代前面两个\n间含0.008的字符串!
作者: awk就是awp加ak    时间: 2006-10-21 14:57
  1. awk '
  2. {
  3.         if ($2~/0.008/){
  4.                 line = $0;
  5.                 if (getline == 1 && $2~/0.008/) ;
  6.                 else print line;

  7.                 print ;
  8.         }
  9. }' urfile
复制代码

作者: lovesaka    时间: 2006-10-21 15:31

  1. sed '/0.008/{n;//d}'
复制代码

作者: awk就是awp加ak    时间: 2006-10-21 15:49
要求是“第二列”
作者: lovesaka    时间: 2006-10-21 21:09
原帖由 awk就是awp加ak 于 2006-10-21 15:49 发表
要求是“第二列”

sorry看走眼了补上一个

  1. perl -e 'while(<>){push @arry,$_}for($i=0;$i<=$#arry;$i++){if($arry[$i]=~/0.008/){next if($arry[$i+1]=~/0.008/);print $arry[$i]}else{print $arry[$i]}}' 1.txt
复制代码

另外给你改一点小错误,^_^有些东西偷赖是不可以的

  1. awk '
  2. {
  3. if ($2~/0.008/)
  4.    {
  5.         line = $0;
  6.         getline
  7.         if ($2~/0.008/);
  8.         else print line
  9.         print
  10.    }
  11. else
  12.    {
  13.         print $0
  14.    }
  15. }' urfile
复制代码

作者: foolboy007    时间: 2006-10-21 23:25
能解释一下这一段具体的意思么??

  1. line = $0;
  2.         getline
  3.         if ($2~/0.008/);
  4.         else print line
  5.         print
复制代码


谢谢各位了
作者: awk就是awp加ak    时间: 2006-10-22 11:26
呵呵!落了 else!没测试就是不行,3ks!
作者: awk就是awp加ak    时间: 2006-10-22 11:31
原帖由 foolboy007 于 2006-10-21 23:25 发表
能解释一下这一段具体的意思么??

  1. line = $0;
  2.         getline
  3.         if ($2~/0.008/);
  4.         else print line
  5.         print
复制代码


谢谢各位了

先保存当前行,读入下一行(getline此时$0,$1等就会改变,为下一行的内容)。如果这行的第二列还是包含0.008,那么就不打印保存的那一行。第二行都是要打印的。或许写成这样会好理解一点:
awk '
{
        if ($2~/0.008/){

                line = $0;
                if (!(getline == 1 && $2~/0.008/)) print line;

                print $0;
        } else print $0;
}' urfile
作者: liuhename    时间: 2006-10-22 11:35
awk '
{
        if ($2~/0.008/){
                line = $0;
                if (getline == 1 && $2~/0.008/) ;
                else print line;

                print ;
        }
}' < $1

是没有问题的.
没有少else呀.
还有想请教一下.

如果想取$2~/0.008/的第二行怎么做呢??
作者: awk就是awp加ak    时间: 2006-10-22 12:59
这么想一下好了,要是if ($2~/0.008/) 总是false,结果会怎么样?——什么都没输出,是吧。




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