我以这种方式获得了格式化文件:
1 223614 225119.537745 Engine45
2 223614 225121.082392 Engine45
3 223614 225124.440309 Engine45
4 223614 225124.763890 Engine45
5 223621 225124.933927 Engine46
6 223614 225124.934205 Engine45
7 223614 225125.354857 Engine45
8 223614 225127.603434 Engine45
.
.
.
我正在尝试创建一个awk / shell来获取1)验证第2列和第4列(如果在同一行中相等),如果适用,则2)在第2列中找到第二个找到的值,并找到第一个找到的值第1列,应该是这样的:
1)发现的第1行:
1 223614 225119.537745 Engine45
第1行发现1):
2 223614 225121.082392 Engine45
输出应该是这个的答案:
225121.082392 - 225119.537745 = 1.544647
下一个输出应为:
第3行找到1):
3 223614 225124.440309 Engine45
第4行找到1):
4 223614 225124.763890 Engine45
输出:225124.763890 - 225124.440309 = 0.323581
依次提供文件中的所有记录。
我相信1)我可以让它工作,但2)对我来说真的很难,但如果有人可以提供如何获得可能非常有用,我知道shell和awk的基础知识,如果它有帮助,但我我愿意接受像perl这样的其他工具。
此致
答案 0 :(得分:0)
如果值不相等,您没有指定要执行的操作。你想跳过2行吗?或者只是其中一个并搜索匹配?
这是一个跳过这两行的Perl解决方案:
perl -e '
while (1) {
@first = split " ", <>;
@second = split " ", <>;
print $second[2] - $first[2], "\n" if $first[1] == $second[1] and $first[3] == $second[3];
last if eof;
}' input-file
答案 1 :(得分:0)
如果两个连续行的值不相同,并且您想跳过这些行,则可以执行以下操作:
awk '!(NR%2) && $2==col2 && $4==col4{print $3-col3}{col2=$2;col3=$3;col4=$4}' file
1.54465
0.323581
2.24858
如果您不想跳过这些行并按原样打印第3列,那么您可以这样做:
awk '!(NR%2){print(($2==col2&&$4==col4)?$3-col3:col3 RS $3)}{col2=$2;col3=$3;col4=$4}' file
1.54465
0.323581
225124.933927
225124.934205
2.24858