Estou tentando extrair um determinado (o quarto) campo do fluxo de texto baseado em coluna e ajustado por 'espaço'. Estou tentando usar o cut
comando da seguinte maneira:
cat text.txt | cut -d " " -f 4
Infelizmente, cut
não trata vários espaços como um delimitador. Eu poderia ter passado pelo awk
awk '{ printf $4; }'
ou sed
sed -E "s/[[:space:]]+/ /g"
para recolher os espaços, mas eu gostaria de saber se existe alguma maneira de lidar cut
e vários delimitadores nativamente?
Respostas:
Experimentar:
Na
tr
página do manual:fonte
cat
aqui. Você poderia passar< text.txt
diretamente paratr
. pt.wikipedia.org/wiki/Cat_%28Unix%29#Useless_use_of_cat-d
e traduzir diretamente de vários caracteres para a guia. Por exemplo: eu vim aqui procurando uma maneira de exportar automaticamente minha exibição:who am i | tr -s ' ()' '\t' | cut -f5
echo "a b c" | cut -d " " -f2-
,echo "a b c" | tr -s " " | cut -d " " -f2-
Como você comenta sua pergunta,
awk
é realmente o caminho a percorrer.cut
É possível usar junto comtr -s
espremer espaços, como mostra a resposta de kev .Permitam-me, no entanto, examinar todas as combinações possíveis para futuros leitores. As explicações estão na seção Teste.
tr | cortar
awk
festança
sed
Testes
Dado este arquivo, vamos testar os comandos:
tr | cortar
awk
festança
Isso lê os campos sequencialmente. Ao usar
_
, indicamos que essa é uma variável descartável como uma "variável indesejada" para ignorar esses campos. Dessa forma, armazenamos$myfield
como o quarto campo no arquivo, independentemente dos espaços entre eles.sed
Isso captura três grupos de espaços e sem espaços
([^ ]*[ ]*){3}
. Então, ele captura o que quer que chegue até um espaço como o quarto campo, com o qual finalmente é impresso\1
.fonte
awk
Além de elegante e simples, ele também está incluído no VMware ESXi, ondetr
está ausente.awk
!read
comando, se não nos importarmos com o que é necessário . Pode ser qualquer coisa, é só que de alguma forma se tornou padrão em vez dejunk_var
ouwhatever
:)solução mais curta / mais amigável
Depois de ficar frustrado com as muitas limitações de
cut
, escrevi meu próprio substituto, que pedicuts
"cortar com esteróides".cortes fornece a provável solução mais minimalista para esse e muitos outros problemas relacionados a cortar / colar.
Um exemplo, dentre muitos, abordando essa questão em particular:
cuts
apoia:paste
separadamente)e muito mais. Nada disso é fornecido por padrão
cut
.Consulte também: https://stackoverflow.com/a/24543231/1296044
Fonte e documentação (software livre): http://arielf.github.io/cuts/
fonte
Este one-liner do Perl mostra o quanto o Perl está relacionado ao awk:
No entanto, a
@F
matriz de divisão automática inicia no índice,$F[0]
enquanto os campos awk começam com$1
fonte
Nas versões que
cut
eu conheço, não, isso não é possível.cut
é útil principalmente para analisar arquivos em que o separador não é um espaço em branco (por exemplo/etc/passwd
) e possui um número fixo de campos. Dois separadores seguidos significam um campo vazio, e isso também vale para espaços em branco.fonte