Pergunta

Eu quero usar o espaço como um delimitador com o comando cut.

O que sintaxe que posso usar para isso?

Foi útil?

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-d, como própria argumento, seguido por um separado argumento que contém um caractere espaço -. sem aspas ou prefixo \

  • (d) : cut-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.
  • 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.

Licenciado em: CC-BY-SA com atribuição
Não afiliado a StackOverflow
scroll top