Como separar campos com espaço ou tabulação no awk

53

Enquanto brincava awk, vim para executar:

ls -la >> a.txt ; awk {'print $5  $1'} a.txt ;

Isso está gerando resultados como:

53277-rw-------
52347-rw-------

Como posso obter um espaço entre esses dois amigos de saída?

rɑːdʒɑ
fonte
11
Como um conselho, você não deve analisar a saída de ls. Isso vai te morder pelas costas mais cedo ou mais tarde.
gniourf_gniourf
No awk, para concatenar duas cordas, basta colocá-las lado a lado -print $5 $1
glenn jackman
2
@kenorb e fechar os eleitores, a duplicata vinculada não é uma duplicata. Eles já sabem como imprimir campos por premissa ( awk {'print $5 $1'} a.txt). Eles estão perguntando como colocar um espaço entre os campos 1 e 5.
kos

Respostas:

73

Apenas mude a linha para

ls -la >> a.txt ; awk {'print $5 "        " $1'} a.txt ;

isso deve imprimir a saída com espaços.

Espero que isto ajude.

Editar:

Conforme sugerido por McNisse, você pode usar printf, o que forneceria um bom formato de saída

ls -la >> a.txt ; awk {'printf ("%5s\t%s\n", $5, $1)'} a.txt ;
devav2
fonte
4
A printffunção fornece um melhor controle, especialmente se você deseja formatar números. printf("%s\t%s\n", $5, $1)
22412 McNisse
11
Existe um erro de digitação na resposta acima? o que 5ssignifica emawk {'printf ("%5s\t%s\n", $5, $1)'}
Vishal
67

Outra técnica específica do awk, use o "separador de campo de saída"

ls -la | awk -v OFS='\t' '{print $5, $1}'

A vírgula é crucial aqui.

Glenn Jackman
fonte
Isso funciona, mas causa $1para ir para nova linha
loretoparisi
9

Uma maneira simples de obter guias é:

awk {'print $5"\t"$1'}
becko
fonte
6

Sei que esse é um tópico antigo, mas estou aprendendo e achei essas postagens úteis. Minha melhor solução foi usar o gawk para inserir espaços entre as variáveis ​​para você.

ls -la | gawk '{print $1, $9}'
codeJediNinjaDork
fonte
3
-1: nada de novo. gawk,, mawkou qualquer outro awk, todos eles inserem espaços se você usar a vírgula, como diz esta resposta .
muru 18/09/14
11
Deveria ser ls -la | awk '{print $1, $9}'. Como Muru disse gawknão é necessário.
Nick Crawford
1

Para colocar o espaço entre os argumentos, basta adicionar " ", por exemplo awk {'print $5" "$1'}.

No entanto, não é recomendável analisar a saída do lscomando , pois não é confiável e a saída é para humanos, não para scripts. Portanto, use comandos alternativos como findou stat.

Aqui está um exemplo usando o GNU stat:

$ stat -t *
001.txt 23 8 81a4 501 20 1000004 242236402 1 0 0 1460260387 1460260239 1460260239 1460260194 4096
7c1c.txt 21 8 81a4 501 20 1000004 242236595 1 0 0 1460261322 1460260486 1460260486 1460260486 4096

que imprimirá sua saída amigável à máquina (em formato conciso), para que você possa obter exatamente o que precisa. Em seguida, use -cpara usar um formato específico, ou use awk, cutou readpara obter as colunas corretas.

Verifique se stat --helphá mais opções. Por exemplo, para imprimir o dia da modificação, verifique este exemplo .

kenorb
fonte
Parece que o OP está tentando analisar a saída para fins de leitura humana e não para a execução de um script (como for i in ls; do $i).
mchid 5/11