Pergunta

Eu estou tentando remover as duas primeiras colunas (da qual eu não estou interessado em) a partir de um arquivo de log DbgView. Eu não consegue encontrar um exemplo que é impressa a partir de coluna de 3 em diante até ao final da linha. Note-se que cada linha tem um número variável de colunas.

Foi útil?

Solução

... ou uma simples solução:. cut -f 3- INPUTFILE basta adicionar o delimitador correto (-d) e você tem o mesmo efeito

Outras dicas

awk '{for(i=3;i<=NF;++i)print $i}' 

Jonathan Feinberg 's resposta imprime cada campo em uma linha separada. Você poderia usar printf para reconstruir o recorde de produção na mesma linha, mas você também pode simplesmente mover os campos um salto para a esquerda.

awk '{for (i=1; i<=NF-2; i++) $i = $(i+2); NF-=2; print}' logfile
awk '{$1=$2=$3=""}1' file

NB:. Este método vai deixar "espaços em branco" em 1,2,3 campos, mas não é um problema se você quiser apenas observar a atividade

awk -v m="\x0a" -v N="3" '{$N=m$N ;print substr($0, index($0,m)+1)}'

Este costeletas que está diante do dado nr campo., N e imprime todo o resto da linha, incluindo campo nr.N e manter o espaçamento original (não faz reformatar). Não mater faz se a cadeia do campo também aparece em outro lugar na linha, que é o problema com a resposta de daisaa.

Definir uma função:

fromField () { 
awk -v m="\x0a" -v N="$1" '{$N=m$N; print substr($0,index($0,m)+1)}'
}

E usá-lo como este:

$ echo "  bat   bi       iru   lau bost   " | fromField 3
iru   lau bost   
$ echo "  bat   bi       iru   lau bost   " | fromField 2
bi       iru   lau bost 

Saída mantém tudo, incluindo espaços à direita

funciona bem para arquivos onde '/ n' é o separador de registro para que você não tem que caractere de nova linha dentro das linhas. Se você quiser usá-lo com outros separadores de registro, em seguida, usar:

awk -v m="\x01" -v N="3" '{$N=m$N ;print substr($0, index($0,m)+1)}'

por exemplo. Funciona bem com quase todos os arquivos, desde que eles não usam hexadecimal caractere nr. 1 dentro das linhas.

E a seguinte linha:

awk '{$1=$2=$3=""; print}' file

Com base na sugestão @ ghostdog74. Mina deve se comportar melhor quando você filtrar linhas, ou seja:.

awk '/^exim4-config/ {$1=""; print }' file

Se você quiser imprimir as colunas após a 3ª por exemplo, na mesma linha, você pode usar:

awk '{for(i=3; i<=NF; ++i) printf "%s ", $i; print ""}'

Por exemplo:

Mar 09:39 20180301_123131.jpg
Mar 13:28 20180301_124304.jpg
Mar 13:35 20180301_124358.jpg
Feb 09:45 Cisco_WebEx_Add-On.dmg
Feb 12:49 Docker.dmg
Feb 09:04 Grammarly.dmg
Feb 09:20 Payslip 10459 %2828-02-2018%29.pdf

Ele irá imprimir:

20180301_123131.jpg
20180301_124304.jpg
20180301_124358.jpg
Cisco_WebEx_Add-On.dmg
Docker.dmg
Grammarly.dmg
Payslip 10459 %2828-02-2018%29.pdf

Como podemos ver, o holerite mesmo com espaço, shows na linha correta.

O seguinte comando awk imprime os últimos N campos de cada linha e no final da linha imprime um caractere de nova linha:

awk '{for( i=6; i<=NF; i++ ){printf( "%s ", $i )}; printf( "\n"); }'

Veja abaixo um exemplo que lista o conteúdo do diretório / usr / bin e, em seguida, detém os últimos 3 linhas e, em seguida, imprime os últimos 4 colunas de cada linha usando awk:

$ ls -ltr /usr/bin/ | tail -3
-rwxr-xr-x 1 root root       14736 Jan 14  2014 bcomps
-rwxr-xr-x 1 root root       10480 Jan 14  2014 acyclic
-rwxr-xr-x 1 root root    35868448 May 22  2014 skype

$ ls -ltr /usr/bin/ | tail -3 | awk '{for( i=6; i<=NF; i++ ){printf( "%s ", $i )}; printf( "\n"); }'
Jan 14 2014 bcomps 
Jan 14 2014 acyclic 
May 22 2014 skype

Bem, você pode facilmente realizar o mesmo efeito usando uma expressão regular. Assumindo que o separador é um espaço, que seria parecido com:

awk '{ sub(/[^ ]+ +[^ ]+ +/, ""); print }'

solução Perl:

perl -lane 'splice @F,0,2; print join " ",@F' file

Estas opções de linha de comando são usados:

  • -n laço em torno de cada linha do arquivo de entrada, não imprimir automaticamente cada linha

  • -l remove novas linhas antes do processamento, e adiciona-los de volta depois

  • -a modo autosplit - linhas de entrada divididas na matriz @F. O padrão é a divisão de espaços em branco

  • -e executar o código perl

splice @F,0,2 limpa remove colunas 0 e 1 a partir da matriz @F

join " ",@F une os elementos da matriz @F, utilizando um espaço entre cada elemento

Se o seu arquivo de entrada é, em vez de delimitado por espaço, uso -F, -lane

delimitada por vírgulas

solução Python:

python -c "import sys;[sys.stdout.write(' '.join(line.split()[2:]) + '\n') for line in sys.stdin]" < file

awk '{a=match($0, $3); print substr($0,a)}'

Primeiro você encontrar a posição do início da terceira coluna. Com substr você vai imprimir a linha inteira ($ 0) começando na posição (neste caso a) até o fim da linha.

Um pouco tarde aqui, mas nenhuma das opções acima parecia trabalho. Tente isto, usando printf, insere espaços entre cada. Eu escolhi não tem nova linha no final.

awk '{for(i=3;i<=NF;++i) printf("%s ",  $i) }'
awk '{for (i=4; i<=NF; i++)printf("%c", $i); printf("\n");}'

imprime registros a partir do quarto campo para o último campo na mesma ordem em que eles estavam no arquivo original

Em Bash você pode usar a seguinte sintaxe com parâmetros posicionais:

while read -a cols; do echo ${cols[@]:2}; done < file.txt

Saiba mais: Manipulação de parâmetros posicionais em Bash Hackers Wiki

Se o seu único sobre ignorar os dois primeiros campos e se você não quer um espaço quando mascarando esses campos (como algumas das respostas acima fazer):

awk '{gsub($1" "$2" ",""); print;}' file
awk '{$1=$2=""}1' FILENAME | sed 's/\s\+//g'

Primeiro duas colunas são limpas, remove sed levando espaços.

colunas

No awk são chamados campos, portanto, NF é a chave

todas as linhas:

awk -F '<column separator>' '{print $(NF-2)}' <filename>

primeira linha apenas:

awk -F '<column separator>' 'NR<=1{print $(NF-2)}' <filename>
Licenciado em: CC-BY-SA com atribuição
Não afiliado a StackOverflow
scroll top