Aqui está uma versão um pouco envolvida para o awk. Algumas diferenças da versão sed do steeldriver:
- Não faz suposições sobre a ordem dos registros
mm10
ou rn5
- Ele pode lidar com um registro
rn5
ausente
- Ele exibirá os registros não correspondentes em
stderr
.
- É muito mais código: -)
Pode ser executado com:
awk -f my_program.awk infile
O código:
# find and store a header
/^NM.*/ { header = $0; next }
# we found an mm10 line
header ~ /_rn5/ {
# get the mm10 line that matches this rn5
mm_match = header
sub("_rn5", "_mm10", mm_match)
# if we have a previous mm10, then print the pair
if (mm_match in headers) {
print header
print
print mm_match
print headers[mm_match]
delete headers[mm_match]
} else {
headers[header] = $0
}
next
}
# we found an mm10 line
header ~ /_mm10/ {
# get the rn5 line that matches this mm10
mm_match = header
sub("_mm10", "_rn5", mm_match)
# if we have a previous rn5, then print the pair
if (mm_match in headers) {
print mm_match
print headers[mm_match]
print header
print
delete headers[mm_match]
} else {
headers[header] = $0
}
next
}
Além disso, esse código pode ser adicionado ao final do arquivo para gerar quaisquer linhas sem correspondência para standard error
:
# The END block is here just to output anything that was unmatched
END {
# dump the unmatched to stderr
for (header in headers) {
print header > "/dev/stderr"
print headers[header] > "/dev/stderr"
}
}
Pode ser executado com:
awk -f my_program.awk infile > outfile 2> unmatched
Que produzirá a saída solicitada (via saída padrão) em outfile
, e produzirá a entrada restante (via erro padrão) em unmatched
. Para obter detalhes sobre o redirecionamento de E / S em toda a sua variedade, consulte o capítulo sobre Redirecionamentos no manual de referência do Bash.