다음 문제에 대한 해결책을 찾도록 도와주세요. 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
tr -s ' '
여러 개의 연속된 공백을 하나로 압축합니다.- 이
awk
코드는 각 입력 줄에 추가 줄바꿈을 추가합니다. par 50p8h
결과 텍스트를 너비 50자(8자 내어쓰기 포함)로 설정합니다.- 이러한
sed
표현식은 빈 줄을 제거하고 줄 시작 부분의 8개 공백을 단일 탭 문자로 바꿉니다.
GNU가 없는 솔루션의 경우 sed
마지막 표현식에 리터럴 탭 문자를 삽입해야 합니다.\t
sed
들여쓰기에 공백을 사용하고 스크린샷(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
그 형식은 유연성이 떨어지므로 여기서는 예상한 결과를 얻으려면 두 번 사용해야 합니다. 또한 각 원래 행이 숫자로 시작한다는 사실도 활용합니다.
tr -s ' '
, 이전과.awk '{ print $0, "\n" }'
, 이전과.fmt
( )에 대한 첫 번째 호출은fmt -w 50
각 단락의 첫 번째 줄을 올바른 너비(50자)로 조정합니다.- 스크립트
awk
는 숫자로 시작하지 않는 모든 줄을 9개의 공백으로 들여씁니다. - 두 번째
fmt
호출은 전체 텍스트의 형식을 50자로 지정하지만 지금 들여쓰기된 줄은 들여쓰기 상태로 유지됩니다. - 이
sed
표현식은 빈 줄을 제거합니다.