파일의 고정 길이 필드를 공백으로 구분된 필드로 변환하는 방법

파일의 고정 길이 필드를 공백으로 구분된 필드로 변환하는 방법

각 필드의 길이가 20자인 고정 길이 행렬 유형 파일이 있습니다.

  1. 공백으로 구분된 파일로 어떻게 변환할 수 있나요?

또한 하이픈( )으로 대체하고 싶은 누락된 값도 있습니다 -.

  1. 어떻게 해야 하나요?

나는 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

관련 정보