Linux에서 한 줄로 파일 분할 및 형식 지정

Linux에서 한 줄로 파일 분할 및 형식 지정

다음 문제에 대한 해결책을 찾도록 도와주세요. Linux에서 아래 예제.txt 파일의 출력을 제공하는 한 줄 명령을 작성하려고 합니다(첨부된 그림).

입력-예제.txt

11430.00    SH: gry to dk gry, firm to mod hd, plty, flk, ea to gt, abd LCM; SLTST: gry, sft to firm, amor to blky, slty to ea
11460.00    SH: gry to dk gry, firm to mod hd, plty, flk, ea to gt, abd LCM; SLTST: gry, sft to firm, amor to blky, slty to ea
11490.00    MRL: lt gry, mod hd, blky, occ flk, wxy; SH: gry to dk gry, firm to mod hd, plty, occ blky, ea to gt; SLTST: gry to dk gry, mod firm to firm, amor, blky, slty
11520.00    SH: gry to dk gry, firm to mod hd, plty, blky, ea to gt, tr MRL, occ LCM; SLTST: gry, occ brnsh rd, firm, amor to blky, ea to g

사용했지만 fmt -w 50 -u Example.txt > FMT_Output.txt원하는 출력이 나오지 않았습니다. 숫자로 시작하는 줄을 제외한 모든 줄에 공백/탭을 추가해야 합니다("필수 출력" 아래에 표시됨). 또한 명령을 사용해 보았지만 sed 's/^/ /이는 다단계 프로세스이며 명령도 원하는 출력을 제공하지 못했습니다. 이를 한 단계 프로세스로 수행할 수 있는 방법이 있는지 알려주실 수 있나요?

산출

업데이트된 질문

불행하게도 포맷된 파일을 로드하려고 하면 작동하지 않습니다. 파일을 로드하면 시스템은 숫자를 첫 번째 열로 인식하고 텍스트를 두 번째 열로 인식해야 합니다. 그러나 서식이 지정된 전체 첫 번째 행은 첫 번째 열에 들어가고 나머지 텍스트는 두 번째 열에 들어갑니다. 열 머리글을 기반으로 형식을 지정하는 방법을 생각해 볼 수 있나요? 새로운 사진을 봐주세요.

DEEP    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

답변1

텍스트 포맷터 par(및 GNU sed)( par해결 방법이 아닌 경우 끝 참조):

$ tr -s ' ' <file.in | awk '{ print $0, "\n" }' | par 50p8h | sed -r -e '/^$/d' -e 's/^ {8}/\t/'
11430.00 SH: gry to dk gry, firm to mod hd, plty,
        flk, ea to gt, abd LCM; SLTST: gry, sft to
        firm, amor to blky, slty to ea
11460.00 SH: gry to dk gry, firm to mod hd, plty,
        flk, ea to gt, abd LCM; SLTST: gry, sft to
        firm, amor to blky, slty to ea
11490.00 MRL: lt gry, mod hd, blky, occ flk, wxy;
        SH: gry to dk gry, firm to mod hd, plty,
        occ blky, ea to gt; SLTST: gry to dk gry,
        mod firm to firm, amor, blky, slty
11520.00 SH: gry to dk gry, firm to mod hd, plty,
        blky, ea to gt, tr MRL, occ LCM; SLTST:
        gry, occ brnsh rd, firm, amor to blky, ea
        to g
  1. tr -s ' '여러 개의 연속된 공백을 하나로 압축합니다.
  2. awk코드는 각 입력 줄에 추가 줄바꿈을 추가합니다.
  3. par 50p8h결과 텍스트를 너비 50자(8자 내어쓰기 포함)로 설정합니다.
  4. 이러한 sed표현식은 빈 줄을 제거하고 줄 시작 부분의 8개 공백을 단일 탭 문자로 바꿉니다.

GNU가 없는 솔루션의 경우 sed마지막 표현식에 리터럴 탭 문자를 삽입해야 합니다.\tsed

들여쓰기에 공백을 사용하고 스크린샷(9 공백)과 똑같이 왼쪽 들여쓰기를 사용하는 솔루션의 경우:

$ tr -s ' ' <file | awk '{ print $0, "\n" }' | par 50p9h | sed -e '/^$/d'
11430.00 SH: gry to dk gry, firm to mod hd, plty,
         flk, ea to gt, abd LCM; SLTST: gry, sft
         to firm, amor to blky, slty to ea
11460.00 SH: gry to dk gry, firm to mod hd, plty,
         flk, ea to gt, abd LCM; SLTST: gry, sft
         to firm, amor to blky, slty to ea
11490.00 MRL: lt gry, mod hd, blky, occ flk, wxy;
         SH: gry to dk gry, firm to mod hd, plty,
         occ blky, ea to gt; SLTST: gry to dk gry,
         mod firm to firm, amor, blky, slty
11520.00 SH: gry to dk gry, firm to mod hd, plty,
         blky, ea to gt, tr MRL, occ LCM; SLTST:
         gry, occ brnsh rd, firm, amor to blky, ea
         to g

추가하는 j것은 50p9h단락을 정당화하는 데 효과적입니다.

11430.00 SH: gry to dk gry,  firm to mod hd, plty,
         flk, ea  to gt, abd LCM;  SLTST: gry, sft
         to firm, amor to blky, slty to ea
11460.00 SH: gry to dk gry,  firm to mod hd, plty,
         flk, ea  to gt, abd LCM;  SLTST: gry, sft
         to firm, amor to blky, slty to ea
11490.00 MRL: lt gry, mod  hd, blky, occ flk, wxy;
         SH: gry to dk gry,  firm to mod hd, plty,
         occ blky, ea to gt; SLTST: gry to dk gry,
         mod firm to firm, amor, blky, slty
11520.00 SH: gry to dk gry,  firm to mod hd, plty,
         blky, ea  to gt, tr MRL,  occ LCM; SLTST:
         gry, occ brnsh rd, firm, amor to blky, ea
         to g

...그리고 l이것을 추가하면 각 단락의 마지막 줄 크기가 조정됩니다(별로 좋지 않음).

11430.00 SH: gry to dk gry,  firm to mod hd, plty,
         flk,  ea  to  gt, abd  LCM;  SLTST:  gry,
         sft  to firm,  amor to  blky, slty  to ea
11460.00 SH: gry to dk gry,  firm to mod hd, plty,
         flk,  ea  to  gt, abd  LCM;  SLTST:  gry,
         sft  to firm,  amor to  blky, slty  to ea
11490.00 MRL: lt gry, mod  hd, blky, occ flk, wxy;
         SH: gry to dk gry,  firm to mod hd, plty,
         occ  blky, ea  to  gt; SLTST:  gry to  dk
         gry, mod  firm to firm, amor,  blky, slty
11520.00 SH:   gry  to   dk  gry,   firm  to   mod
         hd,  plty,  blky,  ea   to  gt,  tr  MRL,
         occ   LCM;   SLTST:    gry,   occ   brnsh
         rd,  firm,   amor  to   blky,  ea   to  g

par대부분의 Unices에 있는 대부분의 패키지 관리자에서 사용할 수 있지만 다음 위치에서 소스 코드를 찾을 수도 있습니다(직접 컴파일하려면).http://www.nicemice.net/par/


해결책은 fmt대신 사용하는 것입니다.par

$ tr -s ' ' <file.in | awk '{ print $0, "\n" }' | fmt -w 50 |
  awk '/^[^0-9]/  { $0 = "         " $0 }
                  { print }' | fmt -w 50 | sed '/^$/d'
11430.00 SH: gry to dk gry, firm to mod hd, plty,
         flk, ea to gt, abd LCM; SLTST: gry, sft
         to firm, amor to blky, slty to ea
11460.00 SH: gry to dk gry, firm to mod hd, plty,
         flk, ea to gt, abd LCM; SLTST: gry, sft
         to firm, amor to blky, slty to ea
11490.00 MRL: lt gry, mod hd, blky, occ flk, wxy;
         SH: gry to dk gry, firm to mod hd, plty,
         occ blky, ea to gt; SLTST: gry to dk gry,
         mod firm to firm, amor, blky, slty
11520.00 SH: gry to dk gry, firm to mod hd, plty,
         blky, ea to gt, tr MRL, occ LCM; SLTST:
         gry, occ brnsh rd, firm, amor to blky, ea
         to g

fmt그 형식은 유연성이 떨어지므로 여기서는 예상한 결과를 얻으려면 두 번 사용해야 합니다. 또한 각 원래 행이 숫자로 시작한다는 사실도 활용합니다.

  1. tr -s ' ', 이전과.
  2. awk '{ print $0, "\n" }', 이전과.
  3. fmt( )에 대한 첫 번째 호출은 fmt -w 50각 단락의 첫 번째 줄을 올바른 너비(50자)로 조정합니다.
  4. 스크립트 awk는 숫자로 시작하지 않는 모든 줄을 9개의 공백으로 들여씁니다.
  5. 두 번째 fmt호출은 전체 텍스트의 형식을 50자로 지정하지만 지금 들여쓰기된 줄은 들여쓰기 상태로 유지됩니다.
  6. sed표현식은 빈 줄을 제거합니다.

관련 정보