Compare o primeiro campo de cada linha cujo primeiro campo é “2000” até que um campo diferente seja encontrado

1

Meu objetivo é comparar o primeiro campo de cada linha cujo primeiro campo é "2000" até que eu encontre um campo diferente.

Digamos que o campo diferente esteja localizado na linha número 6, como no exemplo fornecido; Nesse caso eu pediria ao Bash para imprimir a linha número 5, que é a linha antes da linha "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
    
por Omar Ali 07.01.2016 / 10:33

2 respostas

2

A partir dos comentários abaixo da resposta de kos, é evidente que você deseja imprimir a última linha antes de uma que seja diferente. A abordagem AWK seria a seguinte.

$ 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 way seria assim:

$ 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
    
por Sergiy Kolodyazhnyy 07.01.2016 / 10:41
2

Usando o Perl:

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

Para armazenar o resultado em uma variável:

var=$(perl -lane 'if($F[0]!=2000){print $x;exit}else{$x=$_}' in)
  • if($F[0]!=2000){print $x;exit} : se o primeiro campo não for 2000 , imprime o conteúdo de $x e sai;
  • else{$x=$_} : se o primeiro campo for 2000 , atribui o registro atual a $x .

Isso não imprimirá nada se o primeiro campo do primeiro registro não for 2000 e o último registro cujo primeiro campo for 2000 caso contrário.

% 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
    
por kos 07.01.2016 / 10:52