我有很多输入文件。以下是两个示例输入文件:
输入文件#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部分)有效!
答案 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