데이터를 수집하여 다음 형식으로 "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
이 출력은 이 출력으로 파이프되어 xargs
8개의 열로 재구성됩니다. 마지막으로 이 명령은 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개의 인수가 적습니다. 이로 인해 스크립트가 중지되는 구문 오류가 발생합니다. 하지만 왜 구문 오류 메시지가 표시되지 않는지 모르겠습니다.
이러한 수정에도 불구하고 이 코드는 여전히 특히 취약합니다. 형식을 조금만 변경해도 오류가 발생할 수 있습니다.