如何获得两个不同输入的一些输出(sed 和 nawk

How to get the some output for two different inputs (sed and nawk

我有很多输入文件。以下是两个示例输入文件:

输入文件#1:

5
-124.087 41.52
-124.092 41.54
-124.098 41.56
-124.103 41.58
-124.109 41.60
5
-122.041 41.52
-122.052 41.53
-122.056 41.55
-122.060 41.57
-122.050 41.60

输入文件#2:

5
-124.087 41.52
-124.092 41.54
-124.098 41.56
-124.103 41.58
-124.109 41.60
-5
-122.050 41.60
-122.060 41.57
-122.056 41.55
-122.052 41.53
-122.041 41.52

正如您所注意到的,两个输入文件之间的唯一区别是第二组数字与输入 #2 的顺序相反(并且点数是 -5 而不是 5)。

我想要的输出文件与 BOTH:

相同
-124.087 41.52
-124.092 41.54
-124.098 41.56
-124.103 41.58
-124.109 41.60
-122.050 41.60
-122.060 41.57
-122.056 41.55
-122.052 41.53
-122.041 41.52

(本质上是输入 #2 减去定义的点数 (10 & -10))

这对于输入 #2 来说很简单(解决方案:nawk '{if (NF>1) print $0}' input.txt > output.txt ). 但是,我想要一个命令或一组命令,它们将按顺序打印第一组 5 个数字,然后如果以下整数为正数(例如 5),则以相反的顺序打印以下 5 个点,或者如果整数为负数(例如 - 5) 按照与输入文件相同的顺序打印以下几点。

我已经尝试结合使用 sed、nawk 和 tac 命令来尝试完成此操作。我无法让它工作。有什么建议吗?

ADDITIONAL COMPLICATION AFTER ORIGINAL QUESTION POSTED:

好的,所以如果第二组数字之前的整数是正数,我想反转第二组数字。无论原始问题如何,第一组都将保持相同的顺序。 Andriy Makukha 在下面提供了一个完美的解决方案,但我实际上需要用一个更多的细节来使问题复杂化。

如果第一个数字是负数,我要反转第一组数字。

假设我的输入文件 (#3) 是:

-5
-124.109 41.60
-124.103 41.58
-124.098 41.56
-124.092 41.54
-124.087 41.52
-3
-122.050 41.60
-122.056 41.55
-122.041 41.52

#3 的期望输出:

-124.087 41.52
-124.092 41.54
-124.098 41.56
-124.103 41.58
-124.109 41.60
-122.050 41.60
-122.056 41.55
-122.041 41.52

更新:Andriy 的解决方案(第 2 部分)有效!

awk 'NF==1 { s++; rev=(>0)?1:0; next; }
s==2 && rev { a[++i] = [=10=]; next; }
1
END { while(i>0) print a[i--]; }' input.txt

使用 nawk 版本 20121220 进行测试。

如果您希望代码反转两个部分:

awk '
NF==1 {                               # single element: new section encountered
    while(i>0) print a[i--];          # print out previous section in reverse (if needed)
    s++;                              # increment section counter
    pos = (>0) ? 1 : 0;             # single number is positive?
    next;                             # proceed to next line
}
s==2 && pos || s==1 && !pos {         # are we in "reversing state"? if yes:
    a[++i] = [=11=];                      # remember this line in array
    next;                             # proceed to next line 
}
1                                     # else: print the line as is
END { 
    while(i>0) print a[i--];          # print out previous section in reverse (if needed)
}' input.txt