Minúscula, exceto a primeira coluna

3

Como posso fazer tudo menos a primeira coluna em minúsculas?

como:

1 ONE
2 TWO TWO
3 THREE THREE THREE

saída obrigatória:

1 one
2 two two
3 three three three
    
por ASAD 11.04.2017 / 16:26

4 respostas

5

Você pode usar a extensão sed do GNU \L :

sed -r 's/([^ \t]+\s)(.*)/\L/' file

Explicação

  • -r use ERE
  • s/old/new/ replace old com new
  • ([^ \t]+\s) salva alguns caracteres que não são espaço ou tabulação, seguidos por um espaço ou tabulação
  • (.*) salva qualquer número de caracteres
  • \L imprime a primeira parte salva inalterada, depois a segunda parte salva em minúsculas
por Zanna 11.04.2017 / 16:57
3

awk com iteração em todos, exceto no primeiro campo, e convertendo as cadeias para minúsculas usando tolower() function:

awk '{out=""; for (i=2; i<=NF; i++) out=out" "tolower($i); print out}' file.txt

paste , cut e sed , com ajuda da substituição do processo:

paste -d ' ' <(cut -d' ' -f1 file.txt) <(cut -d' ' -f2- file.txt | \
                                          sed -E 's/([[:upper:]])/\L/g')

Isso tem a condição de abrir o arquivo duas vezes.

Com apenas bash , usando a expansão de parâmetro para converter casos:

while IFS=' ' read -r i j; do echo "${i} ${j,,}"; done <file.txt

Exemplo:

$ cat file.txt 
1 ONE
2 TWO TWO
3 THREE THREE THREE

$ awk '{out=""; for (i=2; i<=NF; i++) out=out" "tolower($i); print out}' file.txt 
1 one
2 two two
3 three three three

$ paste -d ' ' <(cut -d' ' -f1 file.txt) <(cut -d' ' -f2- file.txt | sed -E 's/([[:upper:]])/\L/g')
1 one
2 two two
3 three three three

$ while IFS=' ' read -r i j; do echo "${i} ${j,,}"; done <file.txt
1 one
2 two two
3 three three three
    
por heemayl 11.04.2017 / 16:57
3

Perl abordagem com o uso da função lc() :

$ perl -lne 'print lc($_)' < input.txt                                                       
1 one
2 two two
3 three three three

Abordagem do Python:

$ python -c "import sys;print ''.join([l.lower() for l in sys.stdin])" < input.txt                
1 one
2 two two
3 three three three
  • envia o arquivo de entrada como stdin para o comando python usando < shell redirection
  • usando sys ler todas as linhas usando a compreensão da lista (a estrutura l for l in list ), enquanto usa simultaneamente .lower() method
  • a lista de linhas resultante é unida em uma sequência e impressa

Se você quiser remover a nova linha, você pode fazê-lo adicionando uma única vírgula no final do Python 2 (que é o padrão para o comando python ):

$ python -c "import sys;print ''.join([l.lower() for l in sys.stdin])," < input.txt

Para o Python 3, a função de impressão é diferente e tem uma maneira diferente de remover a nova linha - via end keyword:

$ python3 -c "import sys;print(''.join([l.lower() for l in sys.stdin]),end='')" < input.txt 

As abordagens anteriores assumem que a primeira coluna é numérica como no exemplo do OP. Para uma abordagem genérica em que queremos apenas que colunas não-primeiras sejam convertidas, podemos fazer isso em perl:

$ cat input.txt
1 ONE
SOMETHING TWO TWO
$!@# THREE THREE THREE

$ perl -ane 'print $F[0]; print map { " " . lc($_)} @F[1..$#F];print "\n"' < input.txt        
1 one
SOMETHING two two
$!@# three three three

Em python por questão de legibilidade, podemos fazer um script:

#!/usr/bin/env python
import sys
for line in sys.stdin:
    words = line.strip().split()
    case_words = [ word.lower() for word in words[1:]   ]
    print( " ".join([words[0]]+case_words)  )

Que funciona assim com a mesma entrada do exemplo do perl:

$ ./lowercase_columns.py < input.txt
1 one
SOMETHING two two
$!@# three three three
    
por Sergiy Kolodyazhnyy 11.04.2017 / 19:29
2

Um falecido:

Apenas por diversão, outra abordagem em Python:

python3 -c "for l in open('f'): l = l.split(' ',1); print(l[0], l[1].strip().lower())"

Em que 'f' é o arquivo, entre aspas.

Esta abordagem assume que o arquivo não possui linhas vazias.

Explicação

  • Cada uma das linhas é primeiro dividida na primeira ocorrência do delimitador.

    l = l.split(' ',1)
    
  • Posteriormente, a segunda parte (todas as colunas, exceto a primeira) é reduzida:

    l[1].strip().lower()
    
  • e o resultado combinado é impresso:

    print(l[0], l[1].strip().lower())
    

Exemplo de saída

Em um arquivo:

EEN AAP OP EEN FIETS
2 EEn banaan IS LEKKER
MIJN tante in Marokko
1 ONE
2 TWO TWO
3 THREE THREE THREE

A saída é:

EEN aap op een fiets
2 een banaan is lekker
MIJN tante in marokko
1 one
2 two two
3 three three three
    
por Jacob Vlijm 12.04.2017 / 10:15