给定以下文件结构,

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

是否有方法提取第二列中的值不等于下一行第二列中的值的每一行?
也就是说,我想从这三行中提取第二行,因为1.49不等于1.50。
也许是塞德还是阿威?
我在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}块组成。它一行接一行地运作。如果没有给定条件,则对每一行执行块。BEGIN条件在第一行之前执行。每一行被拆分为字段,这些字段可通过$_number_访问。整行在$0中。
在这里,我将第二个字段与前一个值进行比较,如果它与前一行的Iprint不匹配。在所有情况下,我都将当前行存储到line中,将第二个字段存储到prev中。
如果你真的想得到正确的结果,就要小心浮动比较——比如abs($2 - prev) < eps(awk中没有abs,你需要自己定义它,eps是一个足够小的数字)。实际上,我不确定awk是否转换为数字进行相等性测试,如果不是,则可以安全地进行字符串比较。

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

10-15 17:17