我的目标是比较每一行的第一个字段,其第一个字段为“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