각 필드의 길이가 20자인 고정 길이 행렬 유형 파일이 있습니다.
- 공백으로 구분된 파일로 어떻게 변환할 수 있나요?
또한 하이픈( )으로 대체하고 싶은 누락된 값도 있습니다 -
.
- 어떻게 해야 하나요?
나는 awk
출력 작업을 할 것입니다.
필드 길이가 10자인 파일에 대한 샘플 입력입니다.
head1 head2 head3
a b c
c
c a
출력 예
head1 head2 head3
a b c
- c -
c - c
답변1
진주:
perl -ne '
BEGIN {$width = 10}
while (length) {
($word = substr($_,0,$width)) =~ s/^\s+|\s+$//g; # trim whitespace
$word ||= "-";
print $word, " ";
substr($_,0,$width) = "";
}
print "\n";
' file
답변2
이것은 나에게 효과적입니다.
sed 's/^ //g' input | tr -s "[:blank:]" "," | \
awk -F, '!$1{printf "- "} $1{printf "%s ", $1} \
!$2{printf "- "} $2{printf "%s ", $2} \
!$3{print "-"} $3{print $3}'
설명하다:
sed 's/^ //g' input
선행 공백이 있는 경우 제거tr -s "[:blank:]" ","
: 모든 공백을 쉼표로 바꿉니다.awk ...
: 구분 기호를 사용하여,
값을 인쇄하거나,-
값이 비어 있으면 인쇄합니다.
답변3
awk 메서드
awk '{for(x=0;x<length($0);x+=10)y=y" "((z=substr($0,x,10))~/[[:graph:]]/?z:"-")
gsub(/ +/," ",y);print y;y=""}' file
들판에 공간을 남겨둘 수 있다면
awk '{for(x=0;x<length($0);x+=10){z=gensub(/(^ +| +$)/,"", "g",substr($0,x,10))
y=y" "(z?z:"-")}print y;y=""}' file
답변4
하나가 있는 경우 변수를 gawk
사용하여 고정된 열 경계로 입력을 분할하는 방법을 FIELDWIDTHS
알 수 있습니다. gawk
이는 실험적인 기능입니다. FIELDWIDTHS
필드 분할에 대한 사용을 재정의하도록 할당되었습니다 .FS
다음은 사용 예입니다.
gawk 'BEGIN{
FIELDWIDTHS = "10 10 10"
}
{
s = q = ""
for(i=1;i<=NF;i++)
{
s = $i
gsub(/ +/,"",s)
s = (length(s) )? s : "-"
q = sprintf("%s%s%s",q,(length(q)?OFS:""),s)
}
print q
}
' file