bash - 提取每一行,然后在第二列中提取具有不同值的行

标签 bash awk sed extract

给定以下文件结构,

9.975   1.49000000      0.295   0       0.4880  0.4929  0.5113  0.5245  2.016726        1.0472  -30.7449        1
9.975   1.49000000      0.295   1       0.4870  0.5056  0.5188  0.5045  2.015859        1.0442  -30.7653        1
9.975   1.50000000      0.295   0       0.5145  0.4984  0.4873  0.5019  2.002143        1.0854  -30.3044        2

有没有办法提取下一行中第二列中的值不等于第二列中的值的每一行? IE。从这三行中我想提取第二行,因为 1.49 不等于 1.50。 也许用 sed 或 awk?

这是我在 MATLAB 中的做法:

myline = 1;
mynewline = 1;
while myline < length(myfile)
    if myfile(myline,2) ~= myfile(myline+1,2)
        mynewfile(mynewline,:) = myfile(myline,:);
        mynewline = mynewline+1;
        myline = myline+1;
    else
        myline = myline+1;
    end
end

但是,我的文件现在太大了,我宁愿在将它们传输到我的笔记本电脑之前在终端中执行此提取。

最佳答案

Awk 应该可以。

<data awk '($2 != prev) {print line} {line = $0; prev = $2}'

awk 简介:awk 程序由一组 condition {code} 组成 block 。它逐行运行。如果没有给出条件,则对每一行执行该 block 。 BEGIN条件在第一行之前执行。每行被拆分为字段,可以使用 $_number_ 访问这些字段.完整的行在 $0 中.

这里我比较第二个字段和之前的值,如果不匹配我print整个前一行。在所有情况下,我都将当前行存储到 line 中第二个字段为 prev .

如果您真的想要它正确,请小心 float 比较 - 类似于 abs($2 - prev) < eps (awk 中没有abs,需要自己定义,eps 是一些足够小的数字)。我实际上不确定 awk 是否转换为数字以进行相等性测试,如果不是,则字符串比较是安全的。

关于bash - 提取每一行,然后在第二列中提取具有不同值的行,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/35535404/

相关文章:

linux - 如何处理DISPLAY=:0. 0

linux - Bash 脚本无效空格符号

bash - 使用转换表替换大表中的值

regex - 仅在外部嵌套代码块的开头和结尾插入代码

perl - grep 变量并给出信息输出

linux - 我什么时候应该使用 sed 什么时候应该使用 awk

bash - 使用 heredoc 重定向命令输出

c - 为什么 UNIX bash 脚本中的重定向会丢失打印内容

shell - 使用 shell 脚本解析 hocon 文件

unix - 大于时间戳的 Grep 日志文件