给定以下文件结构,
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/