3 votos

Todo minúsculas pero la primera columna

¿Cómo puedo hacer todo pero la primera columna minúscula?

como:

1 ONE
2 TWO TWO
3 THREE THREE THREE

salida deseada:

1 one
2 two two
3 three three three

5voto

Zanna Puntos 502

Usted podría utilizar GNU sed's minúscula \L de extensión:

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

Explicación

  • -r uso ERE
  • s/old/new/ reemplace old con new
  • ([^ \t]+\s) guardar algunos caracteres que no son de espacio o tabulación, seguido por un espacio o tabulación
  • (.*) guardar cualquier número de caracteres
  • \1\L\2 de impresión de la primera ahorrado parte sin cambios, a continuación, la segunda ahorrado parte convertidas a minúsculas

3voto

heemayl Puntos 21116

awk con iterar sobre todos, pero el primer campo, y la conversión de las cadenas de caracteres a minúsculas usando tolower() función de:

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

paste, cuty sed, con la ayuda de la sustitución de procesos:

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

Esto tiene la salvedad de abrir el archivo dos veces.


Con sólo bash, usando el parámetro de expansión para convertir casos:

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

Ejemplo:

$ 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 $1out}' 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\1/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

3voto

Serg Puntos 17677

Perl enfoque con el uso de lc() función de:

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

Python enfoque:

$ python -c "import sys;print ''.join([l.lower() for l in sys.stdin])" < input.txt                
1 one
2 two two
3 three three three
  • enviar archivo de entrada como stdin para el comando python usando < shell redirección
  • el uso de sys leer todas las líneas con la comprensión de listas ( l for l in list estructura), empleando simultáneamente .lower() método
  • la lista resultante de las líneas se unieron en una cadena y se imprime

Si desea quitar de ella la siguiente línea, usted puede hacerlo mediante la adición de una sola coma al final de Python 2 (que es el predeterminado para python comando ):

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

Para Python 3, la función de impresión es diferente y tiene diferente manera de desnudar ella la siguiente línea - a través de la end de palabras clave:

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

Los enfoques anteriores se asume que la primera columna es numérico como en el OP del ejemplo. Para el enfoque genérico de dónde queremos que no sólo primeras columnas de ser convertidos, podemos hacerlo en 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

En python en aras de la legibilidad, podemos hacer un 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 con la misma entrada como en perl ejemplo:

$ ./lowercase_columns.py < input.txt
1 one
SOMETHING two two
$!@# three three three

2voto

Jacob Vlijm Puntos 24137

Una tarde:

Sólo por diversión, otro de python enfoque:

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

Donde 'f' es el archivo, entre comillas.

Este enfoque asume que el archivo no tiene líneas vacías.

Explicación

  • Cada una de las líneas es de primera división en la primera aparición de la delimitador.

    l = l.split(' ',1)
    
  • Posteriormente, la segunda parte (todas las columnas, pero la primera) es más baja:

    l[1].strip().lower()
    
  • y el resultado combinado es impreso:

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

Ejemplo de salida

En un archivo:

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

El resultado es:

EEN aap op een fiets
2 een banaan is lekker
MIJN tante in marokko
1 one
2 two two
3 three three three

EnMiMaquinaFunciona.com

EnMiMaquinaFunciona es una comunidad de administradores de sistemas en la que puedes resolver tus problemas y dudas.
Puedes consultar las preguntas de otros sysadmin, hacer tus propias preguntas o resolver las de los demás.

Powered by: