usar o espaço como um delimitador com o comando cut
Pergunta
Eu quero usar o espaço como um delimitador com o comando cut
.
O que sintaxe que posso usar para isso?
Solução
cut -d ' ' -f 2
Onde 2 é o número de campo do campo delimitado por espaço que você quiser.
Outras dicas
Normalmente, se você usar o espaço como delimitador, você quer tratar vários espaços como um, porque você analisar a saída de um comando alinhando algumas colunas com espaços. (E a pesquisa no google por que me aqui chumbo)
Neste caso, um único comando cut
não é suficiente, e você precisa usar:
tr -s ' ' | cut -d ' ' -f 2
ou
awk '{print $2}'
para complementar as respostas votos existentes; ponta do chapéu para QZ Suporte para incentivar me para postar uma resposta separada:
Dois mecanismos distintos entram em jogo aqui:
-
(a) se
cut
si requer o delimitador (espaço, neste caso) passado para a opção-d
ser um argumento separado ou se é aceitável para anexá-lo diretamente para-d
. -
(b) como o shell , geralmente analisa argumentos antes de passá-los para o comando a ser invocado.
(a) é atendida por uma citação de as POSIX para utilitários (grifo meu)
Se a sinopse de uma mostra utilitário padrão uma opção com um obrigatório opção de argumento [...] a aplicativos em conformidade devem utilizar separados argumentos para que opção e sua opção de argumento . No entanto , a implementação conforme deverá também pedidos de autorização para especificar a opção e opção de argumento na mesma cadeia de argumento sem intervir caracteres .
Em outras palavras: Neste caso, porque opção de argumento de -d
é obrigatório , pode escolha se para especificar o delimitador como :
- (s) ou: um separado argumento
- (d) OR:. Como um valor
directamente ligado para -d
Depois de ter escolhido (s) ou (d), é o shell 's análise de cadeia literal - (b) - o que importa:
-
Com a abordagem (s) , todas as seguintes formas são equivalentes:
-
-d ' '
-
-d " "
-
-d \<space> # <space> used to represent an actual space for technical reasons
-
-
Com a abordagem (d) , todas as seguintes formas são equivalentes:
-
-d' '
-
-d" "
-
"-d "
-
'-d '
-
d\<space>
-
A equivalência é explicada pelo shell 's de processamento de cadeias de caracteres:
Todos soluções acima resultado no exata mesma cadeia (em cada grupo) pelo cut
tempo os vê :
-
(s) :
cut
vê-d
, como própria argumento, seguido por um separado argumento que contém um caractere espaço -. sem aspas ou prefixo\
-
(d) :
cut
vê-d
mais um char espaço - sem aspas ou prefixo\
! -. Como parte do mesma argumento
A razão as formas nos respectivos grupos são, em última análise idêntica é duplo, com base em como o shell parses strings literais :
- O shell permite literal a ser especificado como é a um mecanismo chamado citando , o que pode levar várias formas :
- single-citado cordas: o conteúdo dentro
'...'
é tomado literalmente e forma um única argumento - entre aspas cordas: o conteúdo dentro
"..."
também forma um única argumento, mas está sujeita a interpolação (expande referências de variáveis ??tais como$var
, substituições de comando ($(...)
ou`...`
), ou expansões aritméticos ($(( ... ))
). - de-citando
\
indivíduo caracteres : a\
anterior um único personagem faz com que esse personagem a ser interpretado como um literal.
- single-citado cordas: o conteúdo dentro
- Citando é complementado por cotação de remoção , o que significa que uma vez que a casca tem analisado uma linha de comando, ele remove os personagens citar os argumentos (anexando
'...'
ou casos"..."
ou\
) - assim, o ser de comando invocada nunca vê os caracteres de citação .
Você também pode dizer
cut -d\ -f 2
Note que existem dois espaços após a barra invertida.
só descobriu que você também pode uso "-d "
:
cut "-d "
Test
$ cat a
hello how are you
I am fine
$ cut "-d " -f2 a
how
am
SCUT , um corte semelhante utilidade (mais inteligente, mas mais lento I fez) que pode usar qualquer regex perl como um sinal de ruptura. Quebrar em espaços em branco é o padrão, mas você também pode quebrar em expressões regulares multi-carvão animal, expressões regulares alternativos, etc.
scut -f='6 2 8 7' < input.file > output.file
de modo que o comando acima iria quebrar colunas em espaços em branco e extrair o (0-base) cols 6 2 7 8 em que ordem.
Você não pode fazê-lo facilmente com corte se os dados tem para espaços exemplo múltiplas. Descobri que é útil para entrada normalize para processamento mais fácil. Um truque é usar sed para a normalização como abaixo.
echo -e "foor\t \t bar" | sed 's:\s\+:\t:g' | cut -f2 #bar
Eu tenho uma resposta (Eu admito um pouco confusa resposta) que involvessed
, expressões regulares e grupos de captura:
-
\S*
- primeira palavra -
\s*
- delimitador -
(\S*)
- segunda palavra - capturado -
.*
- resto da linha
Como uma expressão sed
, as necessidades do grupo de captura para ser escapado, ou seja \(
e \)
.
O \1
retorna uma cópia do grupo capturado, ou seja, a segunda palavra.
$ echo "alpha beta gamma delta" | sed 's/\S*\s*\(\S*\).*/\1/'
beta
Quando você olha para esta resposta, o seu um pouco confuso, e, você pode pensar, por que se preocupar? Bem, eu estou esperando que alguns, pode ir "Aha!" e vai usar esse padrão para resolver alguns problemas de extração de texto complexas com uma única expressão sed
.