it-swarm.com.de

Kleinbuchstaben bis auf die erste Spalte

Wie kann ich alle bis auf die erste Spalte klein schreiben?

mögen:

1 ONE
2 TWO TWO
3 THREE THREE THREE

benötigte Leistung:

1 one
2 two two
3 three three three
3
ASAD

Sie könnten die GNU sed -Erweiterung in Kleinbuchstaben \L verwenden:

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

Erläuterung

  • -r benutze ERE
  • s/old/new/ ersetze old durch new
  • ([^ \t]+\s) Speichern Sie einige Zeichen, bei denen es sich nicht um Leerzeichen oder Tabulatoren handelt, gefolgt von Leerzeichen oder Tabulatoren
  • (.*) Beliebig viele beliebige Zeichen speichern
  • \1\L\2 druckt den ersten gespeicherten Teil unverändert aus, der zweite gespeicherte Teil wird verkleinert
5
Zanna

awk mit Iteration über alle Felder außer dem ersten und Konvertieren der Zeichenfolgen in Kleinbuchstaben mit der Funktion tolower():

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

paste, cut und sed mit Hilfe der Prozessersetzung:

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

Dies hat den Vorbehalt, die Datei zweimal zu öffnen.


Mit nur bash unter Verwendung der Parametererweiterung zum Konvertieren von Fällen:

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

Beispiel:

$ 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
3
heemayl

Perl Ansatz mit der Funktion lc():

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

Python Ansatz:

$ python -c "import sys;print ''.join([l.lower() for l in sys.stdin])" < input.txt                
1 one
2 two two
3 three three three
  • senden Sie die Eingabedatei als stdin an den Befehl python, indem Sie die < Shell-Umleitung verwenden
  • mit sys werden alle Zeilen unter Verwendung des Listenverständnisses (der l for l in list -Struktur) gelesen, während gleichzeitig die .lower() -Methode verwendet wird
  • die resultierende Zeilenliste wird zu einer Zeichenfolge zusammengefasst und ausgedruckt

Wenn Sie nachgestellte Zeilenumbrüche entfernen möchten, können Sie dies tun, indem Sie am Ende ein einzelnes Komma für Python 2 einfügen (dies ist die Standardeinstellung für den Befehl python):

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

Für Python 3 ist die Druckfunktion unterschiedlich und es gibt verschiedene Möglichkeiten, um nachgestellte Zeilenumbrüche zu entfernen - über das Schlüsselwort end:

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

Bisherige Ansätze setzen voraus, dass die erste Spalte wie im Beispiel von OP numerisch ist. Bei einem generischen Ansatz, bei dem nur Nicht-Erstspalten konvertiert werden sollen, können Sie dies in Perl tun:

$ cat input.txt
1 ONE
SOMETHING TWO TWO
[email protected]# THREE THREE THREE

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

In python können wir aus Gründen der Lesbarkeit ein Skript erstellen:

#!/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)  )

Welches funktioniert so mit der gleichen Eingabe wie im Perl-Beispiel:

$ ./lowercase_columns.py < input.txt
1 one
SOMETHING two two
[email protected]# three three three
3

Ein Später:

Nur zum Spaß, ein anderer python Ansatz:

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

Wobei 'f' die Datei zwischen Anführungszeichen ist.

Bei diesem Ansatz wird davon ausgegangen, dass die Datei keine leeren Zeilen enthält.

Erläuterung

  • Jede der Zeilen wird zuerst am ersten Vorkommen des Begrenzers aufgeteilt.

    l = l.split(' ',1)
    
  • Anschließend wird der zweite Teil (alle Spalten außer der ersten) abgesenkt:

    l[1].strip().lower()
    
  • und das kombinierte Ergebnis wird gedruckt:

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

Beispielausgabe

In einer Datei:

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

Die Ausgabe ist:

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