수직으로 수집된 데이터를 테이블로 변환

수직으로 수집된 데이터를 테이블로 변환

데이터를 수집하여 다음 형식으로 "data.txt" 파일에 저장했습니다.

<$ MG_nr>
</200>company-type:Engine1
</210>company-name:STR
</220>address:XX
</230>nr:4568789
</240>zipcode:08765
</250>place:ljkmljubi
</260>phone:786754678
</270>fax:76756778
</$>
<$ MG_nr>
</280>company-type:Engine2
</290>company-name:STR
</300>address:XX
</310>nr:7675678
</320>zipcode:87867
</330>place:jkhgkl
</340>phone:87865
</350>fax:876578
</$>
<$ MG_nr>
</360>company-type:Engine3
</370>company-name:STR
</380>address:XX
</390>nr:78675467
</400>zipcode:87657
</410>place:uiytryui
</420>phone:87656788976
</430>fax:8976535467
</$>
<$ MG_nr>
</440>company-type:Engine4
</450>company-name:STR
</460>address:XX
</470>nr:876578y67
</480>zipcode:786578
</490>place:kljhgryui
</500>phone:8976546789
</510>fax:989765
</$>

다음과 같은 스프레드시트로 바꾸고 싶습니다.

Type         Name   Address   Nr      Zipcode Place     Phone       Fax
------------------------------------------------------------------------
Engine1      STR     XX      4568789  08765   ljkmljubi 786754678   76756778
Engine2      STR     XX      7675678  87867   jkhgkl    87865       876578
Engine3      STR     XX      78675467 87657   uiytryui  87656788976  8976535467
Engine4      STR     XX      87657867 786578  kljhgryui 8976546789 989765

나는 다음 코드를 찾아서 U & L site복제해 보았습니다.

#!/bin/bash
cut -d'>' -f 2 data.txt | awk -F: '
/^company-type:/{type[c]=$2}
/^company-name:/{name[c]=$2}
/^address:/{address[c]=$2}
/^nr:/{nr[c]=$2}
/^zipcode:/{zipcode[c]=$2}
/^place:/{place[c]=$2}
/^phone:/{phone[c]=$2}
/^Fax:/{fax[c]=$2;c++}
END {
 print "Type         Name   Address   Nr Zipcode Place Phone Fax"
 print "------------------------------------------------------------------------"
 for(x in type) {
  printf "%-10s %3d    %s      %s %s %s %s %s\n",
    substr(type[x],2),
    company-name[x],
    address[x],
    nr[x],
    zipcode[x],
    place[x]
    phone[x]
    fax[x]
 }
}' data.txt

하지만 이것은 작동하지 않습니다. 제목만 인쇄됩니다!

print "Type         Name   Address   Nr Zipcode Place Phone Fax"
 print "------------------------------------------------------------------------"

내가 뭘 잘못하고 있는지 알 수 없나요?

어떤 조언이라도 감사하겠습니다! 또는 위의 코드를 효율적이고 간단하게 만들기 위한 제안이 있으신가요?

답변1

더 간단한 해결책은 다음과 같습니다.

awk -F'[>:]' 'BEGIN{print "company-type company-name address nr zipcode place phone fax"}{print $3}' data.txt | xargs -n8 | column -t

company-type  company-name  address  nr        zipcode  place      phone        fax
Engine1       STR           XX       4568789   08765    ljkmljubi  786754678    76756778
Engine2       STR           XX       7675678   87867    jkhgkl     87865        876578
Engine3       STR           XX       78675467  87657    uiytryui   87656788976  8976535467
Engine4       STR           XX       87657867  786578   kljhgryui  8976546789   989765

필드 구분 기호는 및 기반 열의 데이터를 읽은 다음 헤더를 구성하는 동안 필요한 실제 데이터와 동일한 세 번째 열을 인쇄할 -F수 있습니다 .awk:>awk

이 출력은 이 출력으로 파이프되어 xargs8개의 열로 재구성됩니다. 마지막으로 이 명령은 column결과 열 사이에 탭과 동일한 간격을 추가합니다.

답변2

Goro는 좋은 솔루션을 제공하지만 더 나은 이해를 위해 코드가 제대로 작동하지 못하게 하는 몇 가지 문제를 지적해야 한다고 생각했습니다.

  • 변수에 대한 데이터 인덱스를 수집 c하지만 해당 값은 변경하지 않습니다. 이 코드에서는 마지막으로 읽은 데이터만 가져올 수 있습니다. 이전 데이터는 모두 덮어쓰여집니다. 이 문제를 해결하는 쉬운 방법은 /^company-type:/{type[c]=$2} 로 변경하는 것입니다 /^company-type:/{type[++c]=$2}.
  • 회사 유형 필드를 인쇄할 때 뚜렷한 이유 없이 첫 번째 문자를 제거합니다. substr(type[x],2),결과는 "Engine1"이 아니라 "ngine1"입니다(실제로 제거된 데이터에 인쇄할 수 없는 문자가 없다고 가정).
  • 이것이 아마도 출력이 표시되지 않는 이유일 것입니다. place[x],phone[x] 뒤에 쉼표를 추가해야 합니다. printf가 place[x] 다음에 쉼표를 찾지 못하면 이것이 마지막 인수라고 가정하여 format 문에 필요한 8개의 인수보다 2개의 인수가 적습니다. 이로 인해 스크립트가 중지되는 구문 오류가 발생합니다. 하지만 왜 구문 오류 메시지가 표시되지 않는지 모르겠습니다.

이러한 수정에도 불구하고 이 코드는 여전히 특히 취약합니다. 형식을 조금만 변경해도 오류가 발생할 수 있습니다.

관련 정보