더 나은 모양을 위해 텍스트 파일을 포맷하는 방법은 무엇입니까?


3

더 나은 모양을 위해 텍스트 파일을 포맷하고 싶습니다. 그래서 나는 예상대로 파일을 포맷 할 명령이나 쉘 스크립트를 원합니다. 입력 파일:

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

결과물 파일:

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

이를 위해 Microsoft Excel을 사용할 수 있습니까?
Garrulinae

단순한 new.txt 파일이 아닙니다.
ravibhuva9955

그러나 Excel을 사용할 수 있습니까? Excel은 텍스트 파일을 수정할 수 있습니다. 나는 아래에서 효과가있는 답변을 제출했습니다.
Garrulinae

1
형식을 결정 론적으로 분석 할 수 있습니까? Name열에 공간이 포함되어 있으면 다른 열과 공백을 분리해야합니다 City. 그렇지 않으면 어떤 도구도 열을 안정적으로 처리 할 수 ​​없습니다.
Jan Hudec

3
@ ravibhuva9955 : 그런 다음 파일을 생성하는 모든 것을 살펴 봐야합니다. 도시 이름과 사람들의 이름 모두 여분의 단어를 포함 할 수 있으며 더 나은 구분 기호 (최소한 탭)가 없으면 도시를 몰라도 구분할 수있는 방법이 없습니다.
Jan Hudec

답변:


2

펄.

가정 : 도시에는 한 단어 만 있습니다.

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

산출

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

도시에서 이름을 구분할 무언가가 필요합니다 (도시에는 둘 이상의 단어가있을 수 있으므로). 모든 이름이 정확히 두 개의 토큰입니까 (처음 + 마지막)? 그렇다면, 색인 뒤의 어떤 것도 가정 할 수 있으며 두 부분으로 된 이름은 도시 이름입니다. 그렇게하는 것이 있습니다 :

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

상단 (도시)의 마지막 레이블은 수동으로 정렬해야합니다.


아이디어의 경우 +1이지만 실행이 옳지 않습니다 sed -r 's/\s+/~/; s/\s+(\S+)$/~\1/' new.txt | column -s \~ -t.-이것으로 표제가 자동으로 정렬됩니다.
glenn jackman

2

대부분의 Linux 시스템에는 Python이 실행됩니다. 이 파이썬 스크립트를 실행하면 원하는 결과를 얻을 수 있습니다.

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

위의 처음 4 개 항목을 사용했고 다음 출력 파일을 생성했습니다.

Index       Name                    City
1.          Ravi Bhuva              Ahmedabad
2.          Gaurav Bhuva            Rajkot
3.          Nimesh Godhasara        Junagadh
4.          Abhyuday Godhasara      Nadiyad
당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.