Tente:
awk 'NR%2==0 && length($0)!=last{print "Bad pair at lines",NR-1,"and",NR} {last=length($0)}' file
Exemplo
Vamos considerar isso como um arquivo de teste:
$ cat file
good123
good345
bad12
bad123
good_again
good_also1
Usando nosso comando, o par incomparável é identificado corretamente:
$ awk 'NR%2==0 && length($0)!=last{print "Bad pair at lines",NR-1,"and",NR} {last=length($0)}' file
Bad pair at lines 3 and 4
Como funciona
-
NR%2==0 && length($0)!=last{print "Bad pair at lines",NR-1,"and",NR}
Quando estamos em uma linha com numeração par, NR%2==0
, verificamos se o comprimento da linha é o mesmo da linha anterior. Se não for o mesmo, length($0)!=last
, imprimimos uma mensagem.
-
last=length($0)
Isso salva o comprimento da linha atual na variável last
.
Versão de várias linhas
Para aqueles que preferem o código espalhado por várias linhas:
awk '
NR%2==0 && length($0)!=last {
print "Bad pair at lines",NR-1,"and",NR
}
{
last=length($0)
}' file
Como imprimir linhas específicas de um arquivo
Para imprimir, por exemplo, a linha 3 de um arquivo, podemos usar:
$ awk 'NR==3' file
bad12
Para imprimir um intervalo, digamos todas as linhas de 3 a 6, podemos usar:
$ awk 'NR>=3 && NR<=6' file
bad12
bad123
good_again
good_also1
Como alternativa, podemos obter resultados semelhantes do sed usando:
$ sed -n '3p' file
bad12
$ sed -n '3,6p' file
bad12
bad123
good_again
good_also1
Uso de dados de entrada não filtrados
Considere este arquivo de entrada:
$ cat File
@sample1
CGGCATCGTTTATGGTTGAGACTAGGACG
+
AAAAAEEEEEEEEEEEEEEEEEEEEEEEE
@sample2
CCGGCTTCCGGTTCATCCCGCATCGCCAGTTC
+
@sample3
AAAA6E6/EEEEEEEE6/EE/EEAEEAA//E/
+
@sample4
ATTTCGGGGGGGGGGGGGG
+
??????????????????????????????????
@Sample5
GGTTAGCGCGCAGTTGGGCACCGTAACCCGGCTT
+
AAAAAEEEEEAEEEEEEEEEEEEEEEEEE//<EE
@sample6
CTAACCTGTCTCACGACGGTCTAAACCCAGCTCA
+
AAAAAEEEEEEEEEEEEEEEEEEEEEEEEEEEEE
@sample7
CTAACCTGTCTCACGACGGTCTAAACCCAGCTCA
+
AAAAAEEEEEEEEEEEEEEEEEEEEEEEEEEEE
Podemos detectar amostras inválidas, ou seja, amostras com comprimentos de linha desiguais ou com linhas secundárias que começam com ?
, da seguinte forma:
$ awk '/^\+/{next} /^@/{s=$0;n=NR;next} prev{if(/^\?/ || length(prev)!=length($0)) printf "Sample %s (line %s) is bad:\n%s\n%s\n",s,n,prev,$0;prev="";next} {prev=$0}' File
Sample @sample4 (line 11) is bad:
ATTTCGGGGGGGGGGGGGG
??????????????????????????????????
Sample @sample7 (line 23) is bad:
CTAACCTGTCTCACGACGGTCTAAACCCAGCTCA
AAAAAEEEEEEEEEEEEEEEEEEEEEEEEEEEE
Como alternativa, se quisermos ignorar amostras cuja segunda linha ('qualidade') começa com ?
, então:
$ awk '/^\+/{next} /^@/{s=$0;n=NR;next} prev{if(!/^\?/ && length(prev)!=length($0)) printf "Sample %s (line %s) is bad:\n%s\n%s\n",s,n,prev,$0;prev="";next} {prev=$0}' File
Sample @sample7 (line 23) is bad:
CTAACCTGTCTCACGACGGTCTAAACCCAGCTCA
AAAAAEEEEEEEEEEEEEEEEEEEEEEEEEEEE