Como formatar meu arquivo de texto para melhor aparência?

3

Quero formatar meu arquivo de texto para uma melhor aparência. Então eu quero qualquer comando ou qualquer script de shell que irá formatar meu arquivo conforme minha expectativa. Arquivo de Entrada:

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

Arquivo de saída:

Index  Name                          City
1.     Ravi Bhuva                    Ahmedabad
2.     Gaurav Bhuva                  Rajkot
3.     Nimesh Godhasara              Junagadh
4.     Abhyuday Godhasara            Nadiyad
.
.
100.   abcd                          xyz
    
por ravibhuva9955 02.05.2014 / 06:54

3 respostas

2

perl.

Suposição: a cidade tem apenas uma palavra.

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

saída

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      
    
por 07.05.2014 / 19:30
4

Você precisa de algo para delimitar nomes de cidades (já que as cidades também podem ter mais de uma palavra, presumivelmente). Todos os nomes são exatamente dois tokens (primeiro + último)? Se assim for, você pode assumir qualquer coisa depois que o índice e o nome de duas partes for o nome da cidade. Aqui está um que faz isso:

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

embora o último rótulo na parte superior (cidade) deva ser alinhado manualmente.

    
por 02.05.2014 / 22:06
2

A maioria dos sistemas Linux tem python em execução. A execução deste script python fornecerá os resultados que você está procurando:

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

Eu usei as quatro primeiras entradas acima e produzi o seguinte arquivo de saída:

Index       Name                    City
1.          Ravi Bhuva              Ahmedabad
2.          Gaurav Bhuva            Rajkot
3.          Nimesh Godhasara        Junagadh
4.          Abhyuday Godhasara      Nadiyad
    
por 07.05.2014 / 17:36