obtém os primeiros caracteres X do comando cat?

28

Eu tenho um arquivo de texto que estou saindo para uma variável no meu script de shell. Eu só preciso dos primeiros 50 caracteres no entanto.

Eu tentei usar cat ${filename} cut -c1-50 , mas estou conseguindo muito mais do que os primeiros 50 caracteres? Isso pode ser devido a cut procurando por linhas (não com 100% de certeza), enquanto esse arquivo de texto pode ser uma string longa - realmente depende.

Existe um utilitário que eu possa canalizar para obter os primeiros caracteres X de um comando cat ?

    
por jkj2000 13.11.2014 / 19:26

6 respostas

44
head -c 50 file

Isso retorna os primeiros 50 bytes.

Lembre-se de que o comando nem sempre é implementado da mesma forma em todos os sistemas operacionais. No Linux e no MacOS, ele se comporta dessa maneira. No Solaris (11) você precisa usar a versão do gnu em / usr / gnu / bin /

    
por 13.11.2014 / 19:28
25

Seu comando cut funciona se você usar um canal para passar dados para ele:

cat ${file} | cut -c1-50 

Ou evitando o uso inútil do gato e tornando-o um pouco mais seguro:

cut -c1-50 < "$file"

Note que os comandos acima imprimirão os primeiros 50 caracteres (ou bytes, dependendo da sua cut implementação) de cada linha de entrada . Ele deve fazer o que você espera se, como você diz, seu arquivo é uma linha enorme.

    
por 13.11.2014 / 19:38
8
dd status=none bs=1 count=50 if=${filename}

Isso retorna os primeiros 50 bytes.

    
por 13.11.2014 / 19:47
4

A maioria das respostas até agora assume que 1 byte = 1 caractere, o que pode não ser o caso se você estiver usando uma localidade não-ASCII.

Uma maneira um pouco mais robusta de fazer isso:

testString=$(head -c 200 < "${filename}") &&
  printf '%s\n' "${testString:0:50}"

Observe que isso pressupõe:

  1. Você está usando ksh93 , bash (ou um% recentezsh ou mksh (embora o único conjunto de caracteres de vários bytes suportado por mksh seja UTF-8 e somente após set -o utf8-mode )) e uma versão de head que suporta -c (a maioria faz hoje em dia, mas não é estritamente padrão).
  2. A localidade atual é definida com a mesma codificação do arquivo (digite locale charmap e file -- "$filename" para verificar isso); Caso contrário, defina-o com ie. LC_ALL=en_US.UTF-8 )
  3. Eu peguei os primeiros 200 bytes do arquivo com head , assumindo o pior caso de UTF-8, onde todos os caracteres são codificados em no máximo 4 bytes. Isso deve cobrir a maioria dos casos em que posso pensar.
por 14.11.2014 / 14:04
2
grep -om1 "^.\{50\}" ${filename}

Outra variante (para a primeira linha no arquivo)

(IFS= read -r line <${filename}; echo ${line:0:50})
    
por 13.11.2014 / 19:55
-2

Você pode usar sed para isso, o que resolverá o problema com bastante facilidade

sed -e 's/^\(.\{50\}\).*//' yourfile
    
por 14.11.2014 / 13:17

Tags