给定以下文件结构,
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
中。在这里,我将第二个字段与前一个值进行比较,如果它与前一行的I
print
不匹配。在所有情况下,我都将当前行存储到line
中,将第二个字段存储到prev
中。如果你真的想得到正确的结果,就要小心浮动比较——比如
abs($2 - prev) < eps
(awk中没有abs
,你需要自己定义它,eps是一个足够小的数字)。实际上,我不确定awk是否转换为数字进行相等性测试,如果不是,则可以安全地进行字符串比较。关于bash - 提取每行,然后在第二列中提取具有不同值的行,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/35535404/