比较首字段为“2000”的每行的第一个字段,直到找到不同的字段

比较首字段为“2000”的每行的第一个字段,直到找到不同的字段

我的目标是比较每一行的第一个字段,其第一个字段为“2000”,直到找到不同的字段。

假设不同的字段位于行号 6,如所提供的示例所示;在这种情况下,我会要求 Bash 打印行号 5,即“No Living Leaves”行之前的行:

  2000 255    17.    11.     0.    30.  0.05  97. 0.110  6.7  6.7  596. 0.03 0.27  0  0
  2000 256    17.    11.     0.    30.  0.05  97. 0.109  6.7  6.7  596. 0.03 0.22  0  0
  2000 257    17.    11.     0.    30.  0.05  97. 0.109  6.7  6.7  596. 0.02 0.20  0  0
  2000 258    17.    11.     0.    30.  0.05  97. 0.109  6.7  6.7  596. 0.02 0.16  0  0
  2000 259    17.    11.     0.    30.  0.05  97. 0.109  6.6  6.6  596. 0.02 0.18  0  0
  No Living leaves

答案1

从 kos 回答下面的评论中可以明显看出,您想要打印不同行之前的最后一行。AWK方法如下。

$ awk ' $1==2000{line=$0} $1!=2000{exit}END{print line} ' OmarAli.txt                                                            
  2000 259    17.    11.     0.    30.  0.05  97. 0.109  6.6  6.6  596. 0.02 0.18  0  0

bash方式将是这样的:

$ while read LINE; do if [ "${LINE:0:4}" != "2000"  ];then print $PREV; break; fi; PREV=$LINE; done  < OmarAli.txt               
2000 259 17. 11. 0. 30. 0.05 97. 0.109 6.6 6.6 596. 0.02 0.18 0 0

答案2

使用 Perl:

perl -lane 'if($F[0]!=2000){print $x;exit}else{$x=$_}' in

将结果存储到变量中:

var=$(perl -lane 'if($F[0]!=2000){print $x;exit}else{$x=$_}' in)
  • if($F[0]!=2000){print $x;exit}:如果第一个字段不是,则2000打印其内容$x并退出;
  • else{$x=$_}:如果第一个字段是,则将2000当前记录分配给$x

如果第一条记录的第一个字段不是,则不会打印任何内容,否则会打印2000最后一条记录的第一个字段2000

% cat in
2000 255    17.    11.     0.    30.  0.05  97. 0.110  6.7  6.7  596. 0.03 0.27  0  0
2000 256    17.    11.     0.    30.  0.05  97. 0.109  6.7  6.7  596. 0.03 0.22  0  0
2000 257    17.    11.     0.    30.  0.05  97. 0.109  6.7  6.7  596. 0.02 0.20  0  0
2000 258    17.    11.     0.    30.  0.05  97. 0.109  6.7  6.7  596. 0.02 0.16  0  0
2000 259    17.    11.     0.    30.  0.05  97. 0.109  6.6  6.6  596. 0.02 0.18  0  0
No Living leaves
% perl -lane 'if($F[0]!=2000){print $x;exit}else{$x=$_}' in
2000 259    17.    11.     0.    30.  0.05  97. 0.109  6.6  6.6  596. 0.02 0.18  0  0
% var=$(perl -lane 'if($F[0]!=2000){print $x;exit}else{$x=$_}' in)
% echo $var
2000 259    17.    11.     0.    30.  0.05  97. 0.109  6.6  6.6  596. 0.02 0.18  0  0

相关内容