Wie formatiere ich meine Textdatei für ein besseres Erscheinungsbild?

356
ravibhuva9955

Ich möchte meine Textdatei für ein besseres Erscheinungsbild formatieren. Ich möchte also einen Befehl oder ein Shell-Skript, das meine Datei nach meinen Erwartungen formatiert. Eingabedatei:

Index Name City 1. Ravi Bhuva Ahmedabad 2. Gaurav Bhuva Rajkot 3. Nimesh Godhasara Junagadh 4. Abhyuday Godhasara Nadiyad . . 100. abcd xyz 

Ausgabedatei:

Index Name City 1. Ravi Bhuva Ahmedabad 2. Gaurav Bhuva Rajkot 3. Nimesh Godhasara Junagadh 4. Abhyuday Godhasara Nadiyad . . 100. abcd xyz 
3
Sind Sie offen für die Verwendung von Microsoft Excel, um dies zu erreichen? Garrulinae vor 9 Jahren 0
Nein, es ist eine einfache neue.txt-Datei. ravibhuva9955 vor 9 Jahren 0
Aber haben Sie Excel zur Verfügung? Excel kann Textdateien ändern. Ich habe unten eine Antwort übermittelt, die funktionieren wird. Garrulinae vor 9 Jahren 0
Nein, ich habe kein Excel und danke für die schnelle Antwort. ravibhuva9955 vor 9 Jahren 0
Stört es Sie, die `.txt'-Datei in eine` .csv`-Datei zu konvertieren (was vielleicht ein besseres Format für so etwas ist)? joeeey vor 9 Jahren 0
Es ist gut für die Verarbeitung, aber am Ende möchte ich die Datei erneut im TXT-Format. ravibhuva9955 vor 9 Jahren 0
Kann das Format überhaupt deterministisch analysiert werden? Wenn die Spalte "Name" Leerzeichen enthält, muss sie durch etwas anderes von der "Stadt" getrennt werden, da sonst kein Werkzeug sie zuverlässig verarbeiten kann. Jan Hudec vor 9 Jahren 1
Alle Wörter werden nur durch Leerzeichen getrennt. ravibhuva9955 vor 9 Jahren 0
@ ravibhuva9955: Dann muss man sich wirklich ansehen, was die Datei produziert. Sowohl Stadtnamen als auch Personennamen können zusätzliche Wörter enthalten. Wenn es kein besseres Trennzeichen (mindestens ein Tab) gibt, gibt es keine Möglichkeit, sie zu trennen, ohne die Städte zu kennen. Jan Hudec vor 9 Jahren 3

3 Antworten auf die Frage

4
1337 on Tuesdays

You need something to delimit names from cities (since cities may also have more than one word, presumably). Are all names exactly two tokens (first+last)? If so, you can assume anything after the the index and two-part name is city name. Here's one that does so:

cat new.txt | sed 's/^\(\S\+\)\s/\1~/' | sed 's/^\(\S\+\s\+\S\+\)\s\+\(.*\)$/\1~\2/' | column -s \~ -t

though the last label at the top (city) must be aligned manually.

+1 für die Idee, aber die Ausführung ist nicht ganz richtig: `sed -r's / \ s + / ~ /; s / \ s + (\ S +) $ / ~ \ 1 / 'new.txt | column -s \ ~ -t` - damit werden die Überschriften automatisch ausgerichtet. glenn jackman vor 9 Jahren 0
2
KronoS

Auf den meisten Linux-Systemen ist Python ausgeführt. Wenn Sie dieses Python-Skript ausführen, erhalten Sie die gewünschten Ergebnisse:

line_template = "{:8}\t{:20}\t{}\n" name_template = "{} {}"  with open('test.txt') as f: with open('test_new.txt', 'w') as f_new: first_line = f.readline() ind, name, city = first_line.split() f_new.write(line_template.format(ind, name, city))  for line in f: ind, first_name, last_name, city = line.split() name_string = name_template.format(first_name, last_name) f_new.write(line_template.format(ind, name_string, city)) 

Ich habe Ihre ersten 4 Einträge oben verwendet und die folgende Ausgabedatei erstellt:

Index Name City 1. Ravi Bhuva Ahmedabad 2. Gaurav Bhuva Rajkot 3. Nimesh Godhasara Junagadh 4. Abhyuday Godhasara Nadiyad 
2
glenn jackman

Perl.

Annahme: Die Stadt hat nur ein Wort.

perl -MList::Util=max -lane ' push @num, shift @F;  push @city, pop @F;  push @name, join(" ", @F);  END { @max = ( max(map @num), max(map @name), max(map @city) ); printf "%-*s %-*s %-*s\n",  $max[0], $num[$_],  $max[1], $name[$_],  $max[2], $city[$_] for (0..$#num); } ' <<END Index Name City 1. Ravi Bhuva Ahmedabad 2. Gaurav Bhuva Rajkot 3. Nimesh Godhasara Junagadh 4. Abhyuday Godhasara Nadiyad 42. a b c d e f city 100. abcd xyz END 

Ausgabe

Index Name City  1. Ravi Bhuva Ahmedabad 2. Gaurav Bhuva Rajkot  3. Nimesh Godhasara Junagadh  4. Abhyuday Godhasara Nadiyad  42. a b c d e f city  100. abcd xyz