【问题标题】:extract numbers using bash shell script and awk使用 bash shell 脚本和 awk 提取数字
【发布时间】:2016-06-02 05:32:20
【问题描述】:

数据:

 61      -3.5527      1.00000
 62      -3.4695      1.00000
 63      -3.4545      1.00000
 64      -3.1462      1.00000
 65      -1.4512      0.00000
 66      -1.1737      0.00000
 67      -0.8792      0.00000
 61      -3.5590      1.00000
 62      -3.4763      1.00000
 63      -3.4557      1.00000
 68      -3.1533      1.00000
 69      -1.4382      0.00000
 70      -1.1616      0.00000
 71      -0.8638      0.00000

我的期望:

文件1:

 64      -3.1462      1.00000
 68      -3.1533      1.00000

文件2:

 65      -1.4512      0.00000
 69      -1.4382      0.00000

我想通过简单的 bash shell 和 awk 来获取 file1 和 file2。 如何找到第三列的值从 1 更改为 0 的两行? 提前谢谢!

【问题讨论】:

  • 一些细节可能会避免通常的 perl/grep/python/whatnot 对 awk 目标问题的回答:列之间的分隔符是什么?制表符,空格,混合?您是否寻求相当于说 cat Data|grep -e '^64 ' > file1 ?或者Data 行的开头是否有时存在空格?
  • 您必须解释记录进入一个或另一个文件的标准是什么,否则我们必须猜测。这也有助于展示您自己的努力,因为目前看来您希望其他人来完成您的所有工作。
  • 你是对的。本杰明 对不起。我编辑了帖子。

标签: bash shell awk


【解决方案1】:

试试这个awk 脚本:

NR == 1 { last = $3; }
last == 1 && $3 == 0 { print previous > "file1" ; print $0 > "file2" ; }
last != $3 { last = $3; }
{ previous = $0 }

其工作原理如下:如果行号为1,则将第三列记录为last。如果last等于1且当前行第三列等于0,则将变量previous的内容打印到file1,将当前行打印到file2。如果last 的值不等于当前行的第三列,则更改变量的值。最后将当前行记录为previous,用于第二条规则。

由于不需要初始化last,或者检查第三列的值是否发生变化,脚本可以缩短为:

last == 1 && $3 == 0 { print previous > "file1" ; print $0 > "file2" ; }
{ last = $3; previous = $0 }

【讨论】:

  • 谢谢!迈克尔 它有效!我想知道 previous 和 $0 是否是系统变量......你能解释一下你的代码吗?
【解决方案2】:
 awk  'BEGIN{prev=1; prevRec=""} prev == 1  && prevRec != "" && $3 == 0{print $0 > "file1";print prevRec > "file2"} {prev = $3; prevRec=$0}' file

【讨论】:

  • 虽然这在技术上可能是正确的,但您应该解释它的作用
【解决方案3】:
awk '{ tmp=match($3,/[1][.]?????/) ; if (tmp) { lineone=$0 ; newzero=0 ;} else if ( newzero <1) { onechanged[lineone]=1 ; zerochanged[$0]=1 ; newzero=1} } END { print "File1 is: " ; for (key in onechanged){ print key } ; print "File2 is:" ; for (key in zerochanged){ print key }}' test.txt

输出是:

File1 is:
 64      -3.1462      1.00000
 68      -3.1533      1.00000
 File2 is:
 69      -1.4382      0.00000
 65      -1.4512      0.00000

【讨论】:

    【解决方案4】:

    加长版

    awk '
      NR>1 && last==1 && $3==0 {
        print last_line > "file1"
        print $0 > "file2"
      }
      {
         last=$3
         last_line=$0
      }
    ' input.txt
    

    短版

    awk 'NR>1&&x==1&&$3==0{print y>"file1";print $0>"file2"}{x=$3;y=$0}' input.txt
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2022-01-13
      • 2017-07-25
      • 1970-01-01
      • 1970-01-01
      • 2021-08-13
      • 2014-02-02
      • 1970-01-01
      相关资源
      最近更新 更多