如何获得两个不同输入的一些输出(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
我有很多输入文件。以下是两个示例输入文件:
输入文件#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