Essa linha funcionou até eu ter espaços em branco no segundo campo.
svn status | grep '\!' | gawk '{print $2;}' > removedProjs
existe uma maneira de o awk imprimir tudo em US $ 2 ou mais? (US $ 3, US $ 4 ... até não termos mais colunas?)
Suponho que devo acrescentar que estou fazendo isso em um ambiente Windows com Cygwin.
grep | awk
é um antipattern - você querawk '/!/ { print $2 }'
svn status | grep '\!' | cut -d' ' -f2- > removedProjs
Respostas:
imprimirá tudo, exceto a primeira coluna:
imprimirá todas, exceto as duas primeiras colunas:
fonte
awk '{$1=""; print substr($0,2)}' input_filename > output_filename
awk -F, -vOFS=, '{$1=""; print $0}'
Você terminará com um delimitador inicial ($1
ainda está incluído, apenas como uma string vazia). Você pode remover isso comsed
:awk -F, -vOFS=, '{$1=""; print $0}' | sed 's/^,//'
Há uma pergunta duplicada com uma resposta mais simples usando cut:
-d
especifica o delimitador (espaço) ,-f
especifica a lista de colunas (todas começando com a 2ª)fonte
awk
versão, há questões tamponamento linha comcut
, queawk
não tem: stackoverflow.com/questions/14360640/...awk
trata vários caracteres de espaço adjacentes. como um único separador, enquantocut
não; também - embora isso não seja um problema no caso em questão -cut
aceita apenas um único caractere literal. como delimitador, enquantoawk
permite uma regex.Você pode usar um loop for para percorrer os campos de impressão de $ 2 a $ NF (variável interna que representa o número de campos na linha).
Editar: como "imprimir" acrescenta uma nova linha, você deseja armazenar em buffer os resultados:
Como alternativa, use printf:
fonte
'{for(i=11;i<=NF-1;i++){printf "%s ", $i}; print $NF;}'
sem espaços à esquerda ou à direita.Minha resposta é baseada na do VeeArr , mas notei que ele começou com um espaço em branco antes de imprimir a segunda coluna (e o resto). Como eu tenho apenas 1 ponto de reputação, não posso comentar, então aqui está uma nova resposta:
comece com "out" como a segunda coluna e adicione todas as outras colunas (se elas existirem). Isso vai bem desde que haja uma segunda coluna.
fonte
A maioria das soluções com awk deixa espaço. As opções aqui evitam esse problema.
Opção 1
Uma solução de corte simples (funciona apenas com delimitadores únicos):
opção 2
Forçando um awk re-calc às vezes remova o espaço inicial adicionado (OFS) restante removendo os primeiros campos (funciona com algumas versões do awk):
Opção 3
Imprimir cada campo formatado com
printf
dará mais controle:No entanto, todas as respostas anteriores alteram todos os FS repetidos entre os campos para OFS. Vamos criar algumas opções que não fazem isso.
Opção 4 (recomendado)
Um loop com sub para remover campos e delimitadores na frente.
E usando o valor de FS em vez de espaço (que pode ser alterado).
É mais portátil e não aciona uma alteração do FS para OFS: NOTA: O
^[FS]*
é aceitar uma entrada com espaços à esquerda.Opção 5
É bem possível criar uma solução que não adicione espaços em branco extras (iniciais ou finais) e preserve os espaços em branco existentes usando a função
gensub
do GNU awk, da seguinte maneira:Também pode ser usado para trocar um grupo de campos com uma contagem
n
:Obviamente, nesse caso, o OFS é usado para separar ambas as partes da linha, e o espaço em branco à direita dos campos ainda é impresso.
NOTA:
[FS]*
é usado para permitir espaços à esquerda na linha de entrada.fonte
Eu pessoalmente tentei todas as respostas mencionadas acima, mas a maioria delas era um pouco complexa ou simplesmente não estava certa. A maneira mais fácil de fazer isso do meu ponto de vista é:
Onde -F "" define o delimitador para o awk usar. No meu caso, é o espaço em branco, que também é o delimitador padrão do awk. Isso significa que -F "" pode ser ignorado.
Onde NF define o número total de campos / colunas. Portanto, o loop começará do 4º campo até o último campo / coluna.
Onde $ N recupera o valor do enésimo campo. Portanto, imprima $ i imprimirá o campo / coluna atual com base na contagem de loops.
fonte
A lauhub propôs esta solução correta, simples e rápida aqui
fonte
Isso me irritava tanto, sentei-me e escrevi um
cut
analisador de especificação de campo semelhante, testado com o GNU Awk 3.1.7.Primeiro, crie um novo script de biblioteca do Awk chamado
pfcut
, com por exemploEm seguida, cole o script abaixo e salve. Depois disso, é assim que o uso se parece:
Para evitar digitar tudo isso, acho que o melhor que se pode fazer (veja o contrário Carregar automaticamente uma função de usuário na inicialização com o awk? - Unix e Linux Stack Exchange ) é adicionar um alias ao
~/.bashrc
; por exemplo, com:... então você pode simplesmente ligar para:
Aqui está a fonte do
pfcut
script:fonte
cut
, nãoawk
Imprimindo colunas começando em # 2 (a saída não terá espaço à direita no início):
fonte
+
após o espaço, pois os campos podem ser separados por mais de 1 espaço (awk
trata vários espaços adjacentes como um único separador). Além disso,awk
ignorará os espaços à esquerda, portanto, você deve iniciar o regex com^[ ]*
. Com espaço como separador, você pode até generalizar a solução; por exemplo, o seguinte retorna tudo do terceiro campo:awk '{sub(/^[ ]*([^ ]+ +){2}/, ""); print $0}'
Porém, fica mais complicado com separadores de campos arbitrários.Isso funcionaria?
Mas deixa algum espaço em branco na frente.
fonte
este usa o awk para imprimir tudo, exceto o último campo
fonte
Isto é o que eu preferi em todas as recomendações:
Imprimir da sexta à última coluna.
ou
fonte
Se você precisar de colunas específicas impressas com delímetro arbitrário:
Portanto, se você tiver espaço em branco em uma coluna, serão duas colunas, mas poderá conectá-lo a qualquer delimitador ou sem ele.
fonte
Solução Perl:
Essas opções de linha de comando são usadas:
-n
faça um loop em todas as linhas do arquivo de entrada, não imprima automaticamente todas as linhas-l
remove as novas linhas antes do processamento e as adiciona novamente depois-a
modo de divisão automática - divida as linhas de entrada no array @F. O padrão é dividir em espaço em branco-e
executar o código perlsplice @F,0,1
remove de maneira limpa a coluna 0 da matriz @Fjoin " ",@F
une os elementos da matriz @F, usando um espaço entre cada elementoSolução Python:
python -c "import sys;[sys.stdout.write(' '.join(line.split()[1:]) + '\n') for line in sys.stdin]" < file
fonte
Se você não deseja reformatar a parte da linha que não é cortada, a melhor solução que posso pensar está escrita na minha resposta em:
Como imprimir todas as colunas após um número específico usando o awk?
Ele corta o que está antes do número do campo fornecido N e imprime todo o restante da linha, incluindo o número do campo N e mantém o espaçamento original (não reformata). Não importa se a sequência do campo também aparece em outro lugar da linha.
Defina uma função:
E use-o assim:
A saída mantém tudo, incluindo espaços à direita
No seu caso particular:
Se o seu arquivo / fluxo não contiver caracteres de nova linha no meio das linhas (você pode estar usando um Separador de Registros diferente), poderá usar:
O primeiro caso falhará apenas em arquivos / fluxos que contenham o número de caractere hexadecimal raro 1
fonte
Isso funcionaria se você estivesse usando o Bash e pudesse usar o 'x' quantos elementos você deseja descartar e ignora vários espaços se eles não tiverem escapado.
fonte
Perl:
fonte
Essa
awk
função retorna substring$0
que inclui campos debegin
paraend
:Para começar tudo a partir do campo 3:
Para obter uma seção
$0
que abrange os campos 3 a 5:b, e, p, i
um absurdo na lista de parâmetros de função é apenas umaawk
maneira de declarar variáveis locais.fonte
Quero estender as respostas propostas para a situação em que os campos são delimitados por possivelmente vários espaços em branco - a razão pela qual o OP não está usando
cut
, suponho.Eu sei que o OP perguntou sobre
awk
, mas umased
abordagem funcionaria aqui (exemplo com colunas de impressão do quinto ao último):abordagem pura sed
Explicação:
s///
é usado da maneira padrão para executar a substituição^\s*
corresponde a qualquer espaço em branco consecutivo no início da linha\S+\s+
significa uma coluna de dados (caracteres que não são de espaço em branco seguidos por caracteres de espaço em branco)(){4}
significa que o padrão é repetido 4 vezes.sed e cut
apenas substituindo espaços em branco consecutivos por uma única guia;
tr and cut:
tr
também pode ser usado para espremer caracteres consecutivos com a-s
opçãofonte
Os exemplos do awk parecem complexos aqui, aqui está uma sintaxe simples do shell Bash:
Onde
1
é o seu n º contagem coluna 0.Exemplo
Dado este conteúdo do arquivo (
in.txt
):aqui está a saída:
fonte
Eu não estava feliz com nenhuma das
awk
soluções apresentadas aqui, porque queria extrair as primeiras colunas e depois imprimir o restante, então procureiperl
. O código a seguir extrai as duas primeiras colunas e exibe o restante como está:A vantagem em comparação com a
perl
solução de Chris Koknat é que, na verdade, apenas os primeiros n elementos são separados da string de entrada; o restante da string não está dividido e, portanto, permanece completamente intacto. Meu exemplo demonstra isso com uma mistura de espaços e guias.Para alterar a quantidade de colunas que devem ser extraídas, substitua o
3
no exemplo por n + 1.fonte
de esta resposta não é ruim, mas o espaçamento natural é ido.
Por favor, compare-o com este:
Então você veria a diferença.
Mesmo
ls -la | awk '{$1=$2=""; print}'
que é baseado na resposta melhor votada até agora não preserva a formatação.Assim, eu usaria o seguinte e também permite colunas seletivas explícitas no início:
Observe que todo espaço também conta para colunas; por exemplo, abaixo, as colunas 1 e 3 estão vazias, 2 é INFO e 4 é:
fonte
Se você deseja texto formatado, encadeie seus comandos com eco e use $ 0 para imprimir o último campo.
Exemplo:
Impressões:
fonte
Por causa de uma resposta incorreta e votada com 340 votos, acabei de perder 5 minutos da minha vida! Alguém tentou esta resposta antes de votar novamente? Aparentemente não. Completamente inútil.
Eu tenho um log em que, após US $ 5 com um endereço IP, pode haver mais texto ou nenhum texto. Preciso de tudo, desde o endereço IP até o final da linha, caso haja algo após $ 5. No meu caso, isso é realmente um programa awk, não um on-line do awk; portanto, o awk deve resolver o problema. Quando tento remover os 4 primeiros campos usando a resposta mais votada, mas completamente errada:
cospe uma resposta errada e inútil (acrescentei [..] para demonstrar):
Existem até algumas sugestões para combinar substr com esta resposta errada. Como essa complicação é uma melhoria.
Em vez disso, se as colunas tiverem largura fixa até que o ponto de corte e o awk sejam necessários, a resposta correta é:
que produz a saída desejada:
fonte