ls *.DAT | awk -F. '{ if (c[$3$5]) print $0 ; c[$3$5]=$0}'
Acima, o awk analisa cada nome de arquivo usando .
como um separador de campo. Se tiver visto a combinação do terceiro e quinto campos antes, imprime o nome do arquivo. Com seus nomes de arquivo como entrada, o acima produz:
PAT1.URGRSVP.50.WR786842JOB11643.WRS20140.FILE0003.DAT
PAT1.URGRSVP.50.WR786842JOB11694.WRS20140.FILE0002.DAT
MORE: Vamos examinar os comandos awk
em mais detalhes:
if (c[$3$5]) print $0 ; c[$3$5]=$0
O acima consiste em duas declarações: uma declaração "if" e uma atribuição. A declaração "if" é:
if (c[$3$5]) print $0
Nesta declaração, c
é uma "matriz associativa". Isto significa que você lhe dá uma chave e lhe devolve um valor. Estamos usando $3$5
como a chave em que $3
é o terceiro "bloco" (o que o awk chamaria de terceiro "campo") e $5
é o quinto bloco. Se essa chave foi anteriormente não atribuída, então c[$3$5]
retornará um valor vazio (falso). Portanto, se essa combinação de terceiro e quinto blocos foi vista antes, então print $0
é executado, o que significa que todo o nome do arquivo é impresso. Caso contrário, a instrução de impressão é ignorada.
A segunda afirmação é:
c[$3$5]=$0
Isso atribui o nome do arquivo ( $0
) ao array associativo sob a chave do terceiro e quinto campos: $3$5
. Assim, na próxima vez que esses campos forem vistos na instrução "if", a instrução print será executada.