Eu tenho dados com o seguinte formato:
foo<tab>1.00<space>1.33<space>2.00<tab>3
Agora, tentei classificar o arquivo com base no último campo decrescente. Eu tentei os seguintes comandos, mas não foi classificado como esperado.
$ sort -k3nr file.txt # apparently this sort by space as delimiter
$ sort -t"\t" -k3nr file.txt
sort: multi-character tab `\\t'
$ sort -t "`/bin/echo '\t'`" -k3,3nr file.txt
sort: multi-character tab `\\t'
Qual é o caminho certo para fazer isso?
Aqui estão os dados de amostra .
linux
unix
sorting
tab-delimited
neversaint
fonte
fonte
'"'"'
para usá-lo dentro de um alias.awk '{print $0 | "sort -nr" > "outfile" }' datafile
, exceto com um delimitador de tabulação escapado enviado ao comando de classificação.Por padrão, o delimitador de campo não está em branco para transição em branco, portanto, a guia deve funcionar perfeitamente.
No entanto, as colunas são indexadas na base 1 e na base 0, então você provavelmente deseja
para classificar file.txt pela coluna 4 numericamente na ordem inversa. (Embora os dados na pergunta tenham até cinco campos, o último campo seria o índice 5.)
fonte
Você precisa colocar um caractere de tabulação real após o -t \ e, para fazer isso em um shell, pressiona ctrl-v e, em seguida, o caractere de tabulação. A maioria dos shells que usei suporta esse modo de entrada literal da guia.
Cuidado, porém, porque copiar e colar de outro local geralmente não preserva as guias.
fonte
C-q <tab>
por exemplo. Eu acho que também está^V
no nano.A solução $ não funcionou para mim. No entanto, ao colocar o caractere de tabulação no comando: sort -t '' -k2
fonte
<C-v><Tab>
para inserir tabulação caso a tecla tab seja usada para preenchimento automático em seu shell.$'\t'
funciona em ksh, zsh e bash. O shell Bourne não suporta. Veja esta postagem: unix.stackexchange.com/a/371873/201820passe através de algo parecido
awk '{ print print $1"\t"$2"\t"$3"\t"$4"\t"$5 }'
. Isso mudará os espaços para tabulações.fonte
Em geral, manter dados como esse não é algo muito bom se você puder evitá-los, porque as pessoas estão sempre confundindo guias e espaços.
Resolver seu problema é muito simples em uma linguagem de script como Perl, Python ou Ruby. Aqui está um exemplo de código:
fonte
Eu queria uma solução para a classificação Gnu no Windows, mas nenhuma das soluções acima funcionou para mim na linha de comando.
Usando a pista de Lloyd, o seguinte arquivo em lotes (.bat) funcionou para mim.
Digite o caractere de tabulação entre aspas duplas.
fonte
Eu estava tendo esse problema com a classificação no cygwin em um shell bash ao usar 'classificação numérica geral'. Se eu especifiquei
-t$'\t' -kFg
, onde F é o número do campo, ele não funcionou, mas quando eu especifiquei ambos-t$'\t'
e-kF,Fg
(por exemplo,-k7,7g
para o 7º campo) funcionou.-kF,Fg
sem o-t$'\t'
não funcionou.fonte
Se você quiser facilitar as coisas apenas com guias, substitua os espaços por guias:
fonte
usage: tr [-Ccsu] string1 string2
tr string1 string2 <some-file
. Tudo pode ler um arquivo, desde que possa ler stdin.A resposta de Lars Haugseth funcionou apenas na linha de comando para mim, onde ocorre esse erro se executado a partir de um script de shell:
classificar: guia com vários caracteres '$ \ t'
A solução, se estiver codificada em um script de shell, se alguém estiver olhando
o caractere de tabulação está entre as aspas.
fonte