我有一个包含以下输出的文件:
58.752391 0.000 1 1 6.152565 2.757839 14.558406 0.000000 2.156979 0.000000 0.000000 0 0 0 1
16.089417316313 0.000000000000 6.171292860915 2.757949885550 -150168 0
6.953218e-310 0.000000e+00 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000
0.000000 0.000000 0 0 0 0 0.000000 0.000000 0.000000 0
0.000000 0.000000 0 0 0 0 0.000000 0.000000 0.000000 0
-1.000000 -1.000000
0
14034.172996 0.000 13 13 1.107936 1.107936 -1.000000 -1.000000 -1.000000 23.670258 34.172995 0 0 0 0
3085.963203076240 0.667625281751 10.905159250868 8.915904022910 -150168 639
6.953218e-310 0.000000e+00 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000
3.120454 8.844320 8 1 127.895 0 23.670258 1.107936 0.000000 0
1.107936 8.390152 13 5 1e+50 0 34.172995 1.107936 0.000000 0
-1.000000 -1.000000
3 CE1(5-1;8-1) SN1 SN2
等等……
我想检查第 6 行(然后每隔 8 行)中的两个数字是否不同于 -1.000000。如果是这样,根据哪个(第一个、第二个或两者)不同,我想产生以下输出:
1) 第一个数字不同于-1.000000:
这个不同的数字,这个数字之前的 4 行 - 第三列(在这个例子中是 6.171292860915,如果这个数字不同于 -1.000000),这个数字之前的 2 行 - 第 8 列(在这个例子中是 0.000000),同一行 -第7列,这个数字之后的行
2) 第二个数字不同于-1.000000:
这个不同的数字,这个数字之前4行-第四列,这个数字之前1行-第8列,同一行-第7列,这个数字之后的行
3) 第一个和第二个数字不同于-1.000000:
1) 的输出 2) 的输出
我知道如何使用 sed 提取这些行,其中 -1.000000 在我的示例中。现在我想我应该在我的 sed 命令中包含一些 awk 的 ifs 来检查该行是否包含 -1.000000 或其他数字,然后打印我需要的内容。但是,我不知道如何引用 sed 正在检查的行之前的行。如果有任何帮助或线索,我将不胜感激。谢谢!
最佳答案
Perl 来拯救:
#!/usr/bin/perl
use warnings;
use strict;
# Read in "paragraph mode".
$/ = q();
# Auto add newlines.
$\ = "\n";
while (<>) {
my @lines = map [ split ], split /\n/; # Create an array of arrays.
if (-1 != $lines[5][0]) {
print join ' ', $lines[5][0], $lines[1][2], $lines[3][7],
$lines[3][6], @{ $lines[6] };
}
if (-1 != $lines[5][1]) {
print join ' ', $lines[5][1], $lines[1][3], $lines[4][7],
$lines[4][6], @{ $lines[6] };
}
}
关于linux - 如何检查条件,然后使用 awk 在条件行之前的行中打印特定字段?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/31562701/