No shell, eu canalizo para awk quando preciso de uma coluna específica.
Isso imprime a coluna 9, por exemplo:
... | awk '{print $9}'
Como posso dizer ao awk para imprimir todas as colunas, incluindo e após a coluna 9 , não apenas a coluna 9?
No shell, eu canalizo para awk quando preciso de uma coluna específica.
Isso imprime a coluna 9, por exemplo:
... | awk '{print $9}'
Como posso dizer ao awk para imprimir todas as colunas, incluindo e após a coluna 9 , não apenas a coluna 9?
Respostas:
awk '{ s = ""; for (i = 9; i <= NF; i++) s = s $i " "; print s }'
awk -v N=9 '{sep=""; for (i=N; i<=NF; i++) {printf("%s%s",sep,$i); sep=OFS}; printf("\n")}'
cut
ou perl
para isso. Use-o apenas se você realmente insistir em colocá-lo awk
.
Quando você deseja fazer uma variedade de campos, awk
realmente não tem uma maneira direta de fazer isso. Eu recomendaria em cut
vez disso:
cut -d' ' -f 9- ./infile
Adicionado delimitador de campo de espaço devido ao padrão ser uma guia. Obrigado a Glenn por apontar isso
find . | xargs ls -l | cut -d' ' -f 9-
. Por alguma razão, os espaços duplos também são contados. Exemplo: lrwxrwxrwx 1 me me 21 Dec 12 00:00 ./file_a lrwxrwxrwx 1 me me 64 Dec 6 00:06 ./file_b
resultará em./file_a 00:06 ./file_b
awk '{print substr($0, index($0,$9))}'
Editar : Observe que isso não funciona se qualquer campo antes do nono contiver o mesmo valor do nono.
sed -re 's,\s+, ,g' | cut -d ' ' -f 9-
Em vez de lidar com espaços em branco de largura variável, substitua todos os espaços em branco como um único espaço. Em seguida, use simples cut
com os campos de interesse.
Ele não usa awk, então não é pertinente, mas parecia apropriado dadas as outras respostas / comentários.
ps faux |
uso. Nunca tenha medo de admitir que a ferramenta XYZ não seja a mais adequada.
Geralmente perl substitui awk / sed / grep et. al., e é muito mais portátil (além de ser apenas um canivete melhor).
perl -lane 'print "@F[8..$#F]"'
Timtowtdi se aplica, é claro.
-l
ou adicionar \n
à instrução de impressão.
awk -v m="\x01" -v N="3" '{$N=m$N ;print substr($0, index($0,m)+1)}'
Isso corta o que está antes do campo especificado nr., N, e imprime todo o resto da linha, incluindo o campo nr.N e mantém o espaçamento original (não reformata). Não importa se a string do campo aparece também em algum outro lugar da linha, que é o problema com a resposta de Ascherer.
Defina uma função:
fromField () {
awk -v m="\x01" -v N="$1" '{$N=m$N; print substr($0,index($0,m)+1)}'
}
E use-o assim:
$ echo " bat bi iru lau bost " | fromField 3
iru lau bost
$ echo " bat bi iru lau bost " | fromField 2
bi iru lau bost
A saída mantém tudo, incluindo espaços finais Para N = 0 ela retorna a linha inteira, como está, e para n> NF a string vazia
Aqui está um exemplo de ls -l
saída:
-rwxr-----@ 1 ricky.john 1493847943 5610048 Apr 16 14:09 00-Welcome.mp4
-rwxr-----@ 1 ricky.john 1493847943 27862521 Apr 16 14:09 01-Hello World.mp4
-rwxr-----@ 1 ricky.john 1493847943 21262056 Apr 16 14:09 02-Typical Go Directory Structure.mp4
-rwxr-----@ 1 ricky.john 1493847943 10627144 Apr 16 14:09 03-Where to Get Help.mp4
Minha solução para imprimir qualquer coisa $9
éawk '{print substr($0, 61, 50)}'
Para exibir os 3 primeiros campos e imprimir os campos restantes, você pode usar:
awk '{s = ""; for (i=4; i<= NF; i++) s= s $i : "; print $1 $2 $3 s}' filename
onde $ 1 $ 2 $ 3 são os 3 primeiros campos.
Usando cut em vez de awk e superando problemas para descobrir em qual coluna começar usando o comando -c character cut.
Aqui estou dizendo, dê-me todos, exceto os primeiros 49 caracteres da saída.
ls -l /some/path/*/* | cut -c 50-
O /*/*/
no final do comando ls está dizendo mostre-me o que há nos subdiretórios também.
Você também pode puxar certos intervalos de caracteres ala (da página de manual de corte). Por exemplo, mostre os nomes e horários de login dos usuários atualmente conectados:
who | cut -c 1-16,26-38