awk: emula 'pr -mt file *'

1

Enquanto estava jogando com a construção de processamento de vários arquivos awk

awk 'NR == FNR { # some actions; next} # other condition {# other actions}' file*.txt

Eu me perguntei se é possível converter arquivos de texto com tamanhos diferentes para imprimir com awk como

pr -mt file*

Assumindo:

arquivo1.txt

arbitrary text of the first file,
which is not so long.

More arbitrary text of the first file.

arquivo2.txt:

Arbitrary text of the second file.
More arbitrary text of the second file.
More and More arbitrary text of the second file.
It's going on.
But finally every text will end.

A saída deve ser assim:

$ pr -w150 -mt file*
arbitrary text of the first file,         Arbitrary text of the second file.            
which is not so long.                     More arbitrary text of the second file.       
                                          More and More arbitrary text of the second file.  
More arbitrary text of the first file.    It's going on.                    
                                          But finally every text will end.  

Como conseguir isso com o comando awk apenas com o file*.txt ?

    
por John Goofy 03.08.2017 / 14:25

1 resposta

4

Você pode gravar todas as linhas de cada arquivo, anotando o comprimento máximo de linha e o número de linhas de cada um e, em seguida, imprimir todas as linhas no final:

awk '
  FNR == 1 {f++}
  {line[f, FNR] = $0}
  length > width[f] {width[f] = length}
  FNR > max_lines {max_lines = FNR}
  END{
    for (row = 1; row <= max_lines; row++) {
      for (i = 1; i <= f; i++)
        printf "%-*s", (i == f ? 0 : width[i] + 2), line[i, row]
      print ""
    }
  }' ./*.txt
    
por 03.08.2017 / 15:04