在文件中查找列条目符号发生变化的位置并打印发生这种情况的第一行

在文件中查找列条目符号发生变化的位置并打印发生这种情况的第一行

我有多个文件,每个文件包含三列。我想监视给定列条目第一次更改符号的位置(即从负到正),以便我将第一次发生这种情况的行保存到另一个文件中。在下面的示例中,我想监视第一列中符号的变化。

-1 2 4  
-4 3 5  
-2 4 6
1 2 4  
2 4 5    
2 3 4      
-4 5 6  
-3 4 6  

该代码应该保存该行-2 4 6到另一个文件。

答案1

如果改变是总是从负数到正数非负数,这应该可以。它只是打印上一行,并在字段 1 中看到非负值时退出(更改数字以$1查看另一个字段):

$ awk '$1 >= 0 { print prev; exit; } { prev = $0; }' < inputfile
-2 4 6

如果可以以任何一种方式进行更改,我们需要将符号存储在前一行并与其进行比较(这里,有两个地方需要字段编号,因此它取自由 设置的变量-vfield=1):

$ awk -vfield=1 'function sign(x) { if (x < 0) return -1; return +1; }
      NR != 1 && sign($field) != prevsign { print prevline; exit; }
      { prevline = $0; prevsign = sign($field) }' < inputfile

在这两种情况下,您当然可以使用> outputfile将输出重定向到另一个文件。

相关内容