Jak sformatować plik tekstowy, aby uzyskać lepszy wygląd?


3

Chcę sformatować plik tekstowy, aby uzyskać lepszy wygląd. Chcę więc dowolnego polecenia lub dowolnego skryptu powłoki, który sformatuje mój plik zgodnie z moimi oczekiwaniami. Plik wejściowy:

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

Plik wyjściowy:

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

Czy jesteś otwarty na używanie Microsoft Excel, aby to osiągnąć?
— Garrulinae

Nie, to prosty plik new.txt.
— ravibhuva9955

Ale czy masz dostępny program Excel? Excel może modyfikować pliki tekstowe. Podałem poniżej odpowiedź, która zadziała.
— Garrulinae

1
Czy format jest nawet deterministycznie analizowalny? Jeśli Namekolumna zawiera przestrzeń, należy ją oddzielić od Cityczegoś innego, w przeciwnym razie żadne narzędzie nie byłoby w stanie przetwarzać jej w niezawodny sposób.
— Jan Hudec

3
@ ravibhuva9955: Zatem naprawdę musisz rzucić okiem na to, co produkuje plik. Zarówno nazwy miast, jak i nazwiska osób mogą zawierać dodatkowe słowa, a jeśli nie ma lepszego separatora (przynajmniej karty), nie ma możliwości ich rozdzielenia bez znajomości miast.
— Jan Hudec

Odpowiedzi:


2

perl.

Założenie: miasto ma tylko jedno słowo.

perl -MList::Util=max -lane '
    push @num,  shift @F; 
    push @city, pop @F; 
    push @name, join(" ", @F); 
    END {
        @max = (
            max(map {length} @num),
            max(map {length} @name),
            max(map {length} @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

wynik

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      

4

Potrzebujesz czegoś, aby oddzielić nazwy od miast (prawdopodobnie miasta mogą zawierać więcej niż jedno słowo). Czy wszystkie imiona są dokładnie dwoma tokenami (pierwszy + ostatni)? Jeśli tak, możesz założyć cokolwiek po indeksie, a dwuczęściowa nazwa to nazwa miasta. Oto taki, który to robi:

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

chociaż ostatnia etykieta u góry (miasto) musi zostać wyrównana ręcznie.


+1 za pomysł, ale wykonanie nie jest w porządku: sed -r 's/\s+/~/; s/\s+(\S+)$/~\1/' new.txt | column -s \~ -t- dzięki temu nagłówki są automatycznie wyrównane.
— glenn jackman

2

W większości systemów Linux działa na nich Python. Uruchomienie tego skryptu Python zapewni wyniki, których szukasz:

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))

Użyłem twoich oryginalnych pierwszych 4 wpisów powyżej i stworzyłem następujący plik wyjściowy:

Index       Name                    City
1.          Ravi Bhuva              Ahmedabad
2.          Gaurav Bhuva            Rajkot
3.          Nimesh Godhasara        Junagadh
4.          Abhyuday Godhasara      Nadiyad
Korzystając z naszej strony potwierdzasz, że przeczytałeś(-aś) i rozumiesz nasze zasady używania plików cookie i zasady ochrony prywatności.
Licensed under cc by-sa 3.0 with attribution required.