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

时间:2018-06-07 03:00:58

标签: awk sed 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)打印$ 0}' input.txt> output.txt ),这很简单。 但是,我想要一个命令或一组命令,按顺序打印第一组5个数字,然后如果下面的整数是正数(例如5),则按相反顺序打印以下5个点,或者如果整数是负数(例如 - 5)以与输入文件相同的顺序打印以下几点。

我尝试了sed,nawk和tac命令的组合来尝试完成此任务。我无法让它发挥作用。有什么提示吗?

  

原始问题发布后的其他复制:

好的,所以如果第二组数字之前的整数是正数,我想要反转第二组数字。无论原始问题是什么,第一组都保持相同的顺序。 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部分)有效!

1 个答案:

答案 0 :(得分:1)

awk 'NF==1 { s++; rev=($1>0)?1:0; next; }
s==2 && rev { a[++i] = $0; 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 = ($1>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] = $0;                      # 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