Linux에서 텍스트 서식 지정

Linux에서 텍스트 서식 지정

내 시스템으로 가져와야 하는 파일의 데이터 형식을 지정하려고 합니다. 이 시스템에서 텍스트 한 줄의 길이는 65자를 초과하지 않습니다. 그래서 아래 예와 같이 설명 열의 텍스트를 여러 줄로 포맷해 보았습니다. 한 줄의 Linux 명령이라면 사용자에게 정말 도움이 될 것입니다. 작동하는지 확인할 수 있습니까?

파일로부터의 입력 예 -

 
깊이 설명
(발)-
12370.0 LS: Mdst, blsh gry, sft, occ modfirm, crpxln, prly, arg, SLTST: blk, Firm-mod hd, amor, gt, mod calc, CLST: lt gry-m gry, sft, amor, wxy
12400.0 LS: Mdst, blsh gry, modfirm, crpxln, chky, arg, SLTST: blk-dk gry, Firm-mod hd, amor, gt, mod calc, CLST: lt gry-m gry, occ rdsh gry, modfirm, love , wxy, tr CHK
12430.0 LS: Mdst, blsh gry, modfirm, crpxln, chky, arg, SLTST: blk-dk gry, Firm-mod hd, amor, gt, mod calc, SH: blk-dk gry, modfirm, blky-plty, OCC UK 사람들,wxy
12460.0 SH: blk-dk gry, modfirm, blky-plty, occ brit, ea, SLTST: blk-dk gry, Firm-mod hd, amor, gt, mod calc, SST: gry-dk gry, wl consol, vf, ang, p srt, cotd, slily calc cmt, 무불소

깊이 및 설명과 그 아래 줄은 제목으로 간주됩니다. 깊이 열에는 모든 숫자가 포함되고 설명 열에는 시스템이 데이터를 수용할 수 있도록 여러 줄로 형식화해야 하는 텍스트가 포함됩니다.

Linux 명령에서 원하는 출력 -

 
깊이 설명
(발)-
12370.0 LS: Mdst, blsh gry, sft, occ modfirm,
        crpxln, prly, arg, SLTST: blk, 회사 모드 hd,
        amor, gt, mod calc, CLST: lt gry-m gry, sft,
        사랑,wxy
12400.0 LS: Mdst, blsh gry, modfirm, crpxln, chky,
        arg, SLTST: blk-dk gry, Firm-mod hd, 사랑,
        gt, mod calc, CLST: lt gry-m gry, occ rdsh gry,
        모드 견고성, 사랑, wxy, tr CHK
12430.0 LS: Mdst, blsh gry, modfirm, crpxln, chky,
        arg, SLTST: blk-dk gry, Firm-mod hd, 사랑,
        gt, mod calc, SH: blk-dk gry, modfirm,
        blky-plty, OCC UK, wxy
12460.0 SH: blk-dk gry, modfirm, blky-plty, occ Brit,
        ea, SLTST: blk-dk gry, Firm-mod hd, amor, gt,
        모드 계산, SST: gry-dk gry, wl consol, vf, ang,
        p srt, cotd, 미끄러운 석회질 cmt, 무불소

참고 - 사용자는 자신의 컴퓨터에 Linux 패키지를 설치할 수 없습니다. (예 - 파)

답변1

표준 awk:

{ printf("%s\t", $1) }
{
    linelen = 8;  # assume 8 spaces for the first field

    for (i = 2; i <= NF; ++i) {
        wordlen = length($i);

        if (wordlen + linelen > 65) {
            # break output line since adding next word
            # would make it too long
            printf("\n\t");
            linelen = 8; # count tab as 8 spaces
        }

        if (i < NF) {
            printf("%s ", $i);
            linelen += wordlen + 1; # +1 for the space
        } else {
            printf("%s\n", $i);
        }
    }
}

시험:

$ awk -f script.awk file.in
Depth   Description
(ft)    -
12370.0 LS: Mdst, blsh gry, sft, occ mod firm, crpxln, prly, arg,
        SLTST: blk, firm-mod hd, amor, gt, mod calc, CLST: lt
        gry-m gry, sft, amor, wxy
12400.0 LS: Mdst, blsh gry, mod firm, crpxln, chky, arg, SLTST:
        blk-dk gry, firm-mod hd, amor, gt, mod calc, CLST: lt
        gry-m gry, occ rdsh gry, mod firm, amor, wxy, tr CHK
12430.0 LS: Mdst, blsh gry, mod firm, crpxln, chky, arg, SLTST:
        blk-dk gry, firm-mod hd, amor, gt, mod calc, SH: blk-dk
        gry, mod firm, blky-plty, occ brit, wxy
12460.0 SH: blk-dk gry, mod firm, blky-plty, occ brit, ea, SLTST:
        blk-dk gry, firm-mod hd, amor, gt, mod calc, SST: gry-dk
        gry, wl consol, v f, ang, p srt, cotd, slily calc cmt, no
        fluor

유일한 단점은 대부분의 출력 라인에 후행 공백이 남는다는 것입니다. 출력을 전달하여 이를 제거할 수 있습니다 sed 's/ $//'.

답변2

GNU 사용 sed:

$ sed -r '3,$s/(.{55} )/\1\n\t/g' file.in
Depth   Description
(ft)    -
12370.0 LS: Mdst, blsh gry, sft, occ mod firm, crpxln, prly,
        arg, SLTST: blk, firm-mod hd, amor, gt, mod calc, CLST:
        lt gry-m gry, sft, amor, wxy
12400.0 LS: Mdst, blsh gry, mod firm, crpxln, chky, arg,
        SLTST: blk-dk gry, firm-mod hd, amor, gt, mod calc, CLST:
        lt gry-m gry, occ rdsh gry, mod firm, amor, wxy, tr CHK
12430.0 LS: Mdst, blsh gry, mod firm, crpxln, chky, arg,
        SLTST: blk-dk gry, firm-mod hd, amor, gt, mod calc, SH:
        blk-dk gry, mod firm, blky-plty, occ brit, wxy
12460.0 SH: blk-dk gry, mod firm, blky-plty, occ brit, ea,
        SLTST: blk-dk gry, firm-mod hd, amor, gt, mod calc, SST:
        gry-dk gry, wl consol, v f, ang, p srt, cotd, slily calc
        cmt, no fluor

이렇게 하면 줄 끝에 공백이 남게 되는데, 이 공백은 this 를 실행하여 제거할 수 있습니다 sed 's/ $//'.

이 표현식은 3,$s/(.{55} )/\1\n\t/g55자를 모두 동일한 55자(및 공백), 공백, 줄 바꿈 및 탭 들여쓰기로 바꿉니다. 해당 행의 모든 ​​패턴 일치에 대해 이 작업이 반복됩니다.

답변3

해결책:

awk 'NR<=2{ print }NR>2{ c=0; r=$1; 
            for(i=2;i<=NF;i++) { 
               if ((length(r) + length($i)) > (!c? 65:61)) { c++; printf "%s\n\t",r; r=$i } 
               else { r=r FS $i } if(i==NF) printf "%s",r } 
            print "" 
     }' file
  • NR<=2{ print }- 처음 두 줄을 그대로 인쇄합니다.

  • r처리/형식화된 각 행을 포함하는 변수


산출:

Depth   Description
(ft)    -
12370.0 LS: Mdst, blsh gry, sft, occ mod firm, crpxln, prly, arg,
    SLTST: blk, firm-mod hd, amor, gt, mod calc, CLST: lt gry-m
    gry, sft, amor, wxy
12400.0 LS: Mdst, blsh gry, mod firm, crpxln, chky, arg, SLTST:
    blk-dk gry, firm-mod hd, amor, gt, mod calc, CLST: lt gry-m
    gry, occ rdsh gry, mod firm, amor, wxy, tr CHK
12430.0 LS: Mdst, blsh gry, mod firm, crpxln, chky, arg, SLTST:
    blk-dk gry, firm-mod hd, amor, gt, mod calc, SH: blk-dk gry,
    mod firm, blky-plty, occ brit, wxy
12460.0 SH: blk-dk gry, mod firm, blky-plty, occ brit, ea, SLTST:
    blk-dk gry, firm-mod hd, amor, gt, mod calc, SST: gry-dk gry,
    wl consol, v f, ang, p srt, cotd, slily calc cmt, no fluor

관련 정보