이 결과 세트의 모든 항목에 대해 "estimated" 및 "fullSign" 태그 2개에 대한 데이터를 가져와야 합니다.
RESULT SET:
<?xml version="1.0" encoding="UTF-8"?>
<resultSet xmlns="urn:trimet:arrivals" queryTime="1469138325745"><location desc="Morrison/SW 3rd Ave MAX Station" dir="Westbound" lat="45.5181811277907" lng="-122.675385866199" locid="8381" /><arrival block="9007" departed="true" dir="1" status="estimated" estimated="1469138452000" fullSign="MAX Blue Line to Hillsboro" piece="1" route="100" scheduled="1469138250000" shortSign="Blue to Hillsboro" locid="8381" detour="false"><blockPosition feet="1901" at="1469138300978" heading="201" lat="45.5214364" lng="-122.6716177"><trip desc="Hatfield Government Center" dir="1" route="100" tripNum="6557314" destDist="77046" pattern="54" progress="75145" /></blockPosition></arrival><arrival block="9050" departed="true" dir="1" status="estimated" estimated="1469138664000" fullSign="MAX Red Line to City Center & Beaverton" piece="1" route="90" scheduled="1469138670000" shortSign="Red Line to Beaverton" locid="8381" detour="false"><blockPosition feet="4552" at="1469138313683" heading="237" lat="45.5277621" lng="-122.6687878"><trip desc="Beaverton TC Pocket" dir="1" route="90" tripNum="6556307" destDist="66321" pattern="15" progress="61769" /></blockPosition></arrival><arrival block="9018" departed="true" dir="1" status="estimated" estimated="1469139140000" fullSign="MAX Blue Line to Hillsboro" piece="1" route="100" scheduled="1469139150000" shortSign="Blue to Hillsboro" locid="8381" detour="false"><blockPosition feet="13687" at="1469138320005" heading="239" lat="45.5309688" lng="-122.6350333"><trip desc="Hatfield Government Center" dir="1" route="100" tripNum="6557315" destDist="77046" pattern="54" progress="63359" /></blockPosition></arrival><arrival block="9043" departed="true" dir="1" status="estimated" estimated="1469139577000" fullSign="MAX Red Line to City Center & Beaverton" piece="1" route="90" scheduled="1469139570000" shortSign="Red Line to Beaverton" locid="8381" detour="false"><blockPosition feet="31909" at="1469138310486" heading="285" lat="45.5320383" lng="-122.5738342"><trip desc="Beaverton TC Pocket" dir="1" route="90" tripNum="6556308" destDist="66321" pattern="15" progress="34412" /></blockPosition></arrival></resultSet>
예상되는 결과:
1469138452000 MAX Blue Line to Hillsboro
1469138664000 MAX Red Line to City Center & Beaverton
1469139140000 MAX Blue Line to Hillsboro
1469139577000 MAX Red Line to City Center &Beaverton
이 데이터를 추출하는 좋은 방법은 무엇입니까?
답변1
이는 XMLstarlet을 사용하여 수행되며 paste
아마도 XMLstarlet을 한 번 호출하여 수행할 수 있지만 저는 마법사가 아닙니다.
$ paste <(xml sel -T -t -v '//@estimated' data.xml) \
<(xml sel -T -t -v '//@fullSign' data.xml)
1469138452000 MAX Blue Line to Hillsboro
1469138664000 MAX Red Line to City Center & Beaverton
1469139140000 MAX Blue Line to Hillsboro
1469139577000 MAX Red Line to City Center & Beaverton
답변2
$ xml2 < sunnx.xml | awk -F= '
$1 ~ /@fullSign/ { fs=$2 ; sub(/&/,"&",fs) };
$1 ~ /@estimated/ { est=$2 };
fs && est { printf "%s %s\n", est, fs; fs=est="" }'
1469138452000 MAX Blue Line to Hillsboro
1469138664000 MAX Red Line to City Center & Beaverton
1469139140000 MAX Blue Line to Hillsboro
1469139577000 MAX Red Line to City Center & Beaverton
&
대신 리터럴을 원한다면 함수 호출을 &
제거하십시오 . 인코딩된 엔터티를 디코딩하므로 요청에 맞게 다시 변경하는 출력을 추가했습니다 .sub()
xml2
sub()
그렇지 않은 경우 sub()
출력은 다음과 같습니다.
1469138452000 MAX Blue Line to Hillsboro
1469138664000 MAX Red Line to City Center & Beaverton
1469139140000 MAX Blue Line to Hillsboro
1469139577000 MAX Red Line to City Center & Beaverton