Bagaimana cara memformat file teks saya untuk penampilan yang lebih baik?

3

Saya ingin memformat file teks saya untuk penampilan yang lebih baik. Jadi saya ingin perintah atau skrip shell yang akan memformat file saya sesuai harapan saya. File Input:

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

Berkas keluaran:

Index  Name                          City
1.     Ravi Bhuva                    Ahmedabad
2.     Gaurav Bhuva                  Rajkot
3.     Nimesh Godhasara              Junagadh
4.     Abhyuday Godhasara            Nadiyad
.
.
100.   abcd                          xyz
ravibhuva9955
sumber
Apakah Anda terbuka untuk menggunakan Microsoft Excel untuk mencapai ini?
Garrulinae
Tidak, ini file new.txt yang sederhana.
ravibhuva9955
Tetapi apakah Anda memiliki Excel? Excel dapat memodifikasi file teks. Saya telah mengirimkan jawaban di bawah ini yang akan berfungsi.
Garrulinae
1
Apakah formatnya bahkan dapat diurai? Jika Namekolom berisi ruang, itu harus dipisahkan dari Citydengan sesuatu yang lain, jika tidak, tidak ada alat yang dapat memprosesnya dengan andal.
Jan Hudec
3
@ ravibhuva9955: Maka Anda benar-benar perlu melihat apa pun yang menghasilkan file. Baik nama kota dan nama orang dapat mengandung kata-kata tambahan dan jika tidak ada pemisah yang lebih baik (setidaknya tab), tidak ada cara untuk memisahkan mereka tanpa mengetahui kota.
Jan Hudec

Jawaban:

2

perl.

Asumsi: kota hanya memiliki satu kata.

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

keluaran

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      
glenn jackman
sumber
4

Anda perlu sesuatu untuk membatasi nama dari kota (karena kota mungkin juga memiliki lebih dari satu kata, mungkin). Apakah semua nama persis dua token (pertama + terakhir)? Jika demikian, Anda dapat mengasumsikan apa pun setelah indeks dan nama dua bagian adalah nama kota. Inilah yang melakukannya:

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

meskipun label terakhir di atas (kota) harus disejajarkan secara manual.

1337 pada hari Selasa
sumber
Memberi +1 untuk gagasan, tetapi eksekusi tidak sepenuhnya benar: sed -r 's/\s+/~/; s/\s+(\S+)$/~\1/' new.txt | column -s \~ -t- dengan ini, pos akan diselaraskan secara otomatis.
glenn jackman
2

Sebagian besar sistem Linux menggunakan python. Menjalankan skrip python ini akan memberi Anda hasil yang Anda cari:

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

Saya menggunakan Anda asli 4 entri pertama di atas dan menghasilkan file output berikut:

Index       Name                    City
1.          Ravi Bhuva              Ahmedabad
2.          Gaurav Bhuva            Rajkot
3.          Nimesh Godhasara        Junagadh
4.          Abhyuday Godhasara      Nadiyad
James Mertz
sumber