파일의 각 줄 텍스트를 재정렬하고 마지막으로 XML로 변환합니다.

파일의 각 줄 텍스트를 재정렬하고 마지막으로 XML로 변환합니다.

로그 파일을 작업 중인데 각 줄을 다시 정렬(정렬 아님)해야 합니다. 로그 파일은 다음과 같습니다.

11-06-2014 - 10:49:06PM lat = 41.858657; lon = -91.345142
11-06-2014 - 10:49:49PM lat = 42.864653; lon = -92.349914
11-06-2014 - 10:50:35PM lat = 43.874808; lon = -93.350364
11-06-2014 - 10:51:21PM lat = 44.885047; lon = -94.350058
11-06-2014 - 10:52:08PM lat = 45.895078; lon = -95.349920
11-06-2014 - 10:53:30PM lat = 46.905178; lon = -96.349837
11-06-2014 - 10:54:50PM lat = 47.910303; lon = -97.350606

날짜/시간을 각 행의 끝으로 이동하고 싶습니다.

lat = 41.858657; lon = -91.345142 11-06-2014 - 10:49:06PM
lat = 42.864653; lon = -92.349914 11-06-2014 - 10:49:49PM
lat = 43.874808; lon = -93.350364 11-06-2014 - 10:50:35PM
lat = 44.885047; lon = -94.350058 11-06-2014 - 10:51:21PM
lat = 45.895078; lon = -95.349920 11-06-2014 - 10:52:08PM
lat = 46.905178; lon = -96.349837 11-06-2014 - 10:53:30PM
lat = 47.910303; lon = -97.350606 11-06-2014 - 10:54:50PM

sed? awk? 어떻게?

보너스 질문: 나의 궁극적인 목표는 이것을 gpx/xml로 변환하는 것입니다. 각 줄이 처리될 때 중간 텍스트를 추가하는 것이 쉬울 수 있으므로 출력은 다음과 같습니다.

<wpt lat="41.858657" lon="-91.345142">
    <time>11-06-2014 - 10:49:06PM</time>
</wpt>

<wpt lat"="42.864653" lon="-92.349914">
     <time>11-06-2014 - 10:49:49PM</time>
</wpt>

<wpt lat"="43.874808" lon="-93.350364">
     <time>11-06-2014 - 10:50:35PM</time>
</wpt>

<wpt lat"="44.885047" lon="-94.350058">
     <time>11-06-2014 - 10:51:21PM</time>
</wpt>

<wpt lat"="45.895078" lon="-95.349920">
     <time>11-06-2014 - 10:52:08PM</time>
</wpt>

<wpt lat"="46.905178" lon="-96.349837">
     <time>11-06-2014 - 10:53:30PM</time>
</wpt>

<wpt lat"="47.910303" lon="-97.350606">
     <time>11-06-2014 - 10:54:50PM</time>
</wpt>

답변1

awk 사용:

 awk '{print $4,$5,$6,$7,$8,$9,$1,$2,$3}' log_file

다음과 같이 로그 파일에서 직접 이 작업을 수행할 수 있습니다.

awk '{printf("<wpt %s%s\"%s\" %s%s\"%s\">\n<time>%s %s %s</time>\n</wpt>\n",$4,$5,substr($6,0,length($6)),$7,$8,$9,$1,$2,$3)}' log_file

산출:

<wpt lat="41.858657" lon="-91.345142">
<time>11-06-2014 - 10:49:06PM</time>
</wpt>
<wpt lat="42.864653" lon="-92.349914">
<time>11-06-2014 - 10:49:49PM</time>
</wpt>
<wpt lat="43.874808" lon="-93.350364">
<time>11-06-2014 - 10:50:35PM</time>
</wpt>
<wpt lat="44.885047" lon="-94.350058">
<time>11-06-2014 - 10:51:21PM</time>
</wpt>
<wpt lat="45.895078" lon="-95.349920">
<time>11-06-2014 - 10:52:08PM</time>
</wpt>
<wpt lat="46.905178" lon="-96.349837">
<time>11-06-2014 - 10:53:30PM</time>
</wpt>
<wpt lat="47.910303" lon="-97.350606">
<time>11-06-2014 - 10:54:50PM</time>
</wpt>

답변2

당신은 그것을 사용할 수 있습니다

perl -lane 'print "@F[2..$#F] $F[0] $F[1]"' log_file

로그 라인을 뒤집습니다.

답변3

sed '   s/ *[=;]"* */="/g;s//" /2         #first sub-out spaces; for "
        s|\(.*M\) \(.*\)|\                #then do the replace
<wpt \2">\
        <time>\1</time>\
</wpt>|
' <<\INPUT
11-06-2014 - 10:49:06PM lat = 41.858657; lon = -91.345142
11-06-2014 - 10:49:49PM lat = 42.864653; lon = -92.349914
11-06-2014 - 10:50:35PM lat = 43.874808; lon = -93.350364
11-06-2014 - 10:51:21PM lat = 44.885047; lon = -94.350058
11-06-2014 - 10:52:08PM lat = 45.895078; lon = -95.349920
11-06-2014 - 10:53:30PM lat = 46.905178; lon = -96.349837
11-06-2014 - 10:54:50PM lat = 47.910303; lon = -97.350606
INPUT

이것이 내가 생각해 낸 것입니다. 이것은 매우 간단합니다 sed. 여기서는 읽기가 더 쉽기 때문에 리터럴 문자를 사용하고 있으며 모든 sed'이(가) 올바른 대체 필드에서 이스케이프되는 백슬래시를 처리하는 것은 아닙니다. 그게 당신이라면, 마음대로 하세요. 그럼에도 불구하고 이러한 인라인 주석은 무엇이든 엉망으로 만들 수 있으므로 sed테스트하기 전에 제거하십시오.

산출

<wpt lat="41.858657" lon="-91.345142">
        <time>11-06-2014 - 10:49:06PM</time>
</wpt>

<wpt lat="42.864653" lon="-92.349914">
        <time>11-06-2014 - 10:49:49PM</time>
</wpt>

<wpt lat="43.874808" lon="-93.350364">
        <time>11-06-2014 - 10:50:35PM</time>
</wpt>

<wpt lat="44.885047" lon="-94.350058">
        <time>11-06-2014 - 10:51:21PM</time>
</wpt>

<wpt lat="45.895078" lon="-95.349920">
        <time>11-06-2014 - 10:52:08PM</time>
</wpt>

<wpt lat="46.905178" lon="-96.349837">
        <time>11-06-2014 - 10:53:30PM</time>
</wpt>

<wpt lat="47.910303" lon="-97.350606">
        <time>11-06-2014 - 10:54:50PM</time>
</wpt>

답변4

다음에도 적용됩니다.sed

sed -E 's&(.*M)( .*);( .*)$&<wpt\2\3>\n\t<time>\1</time>\n</wpt>&;
        $!G;
        s& = ([-.0-9]+)&="\1"&g' log.file

아니면 스크립트 파일에 넣어두세요

#!/bin/sed -Ef
s|(.*M)( .*);( .*)$|<wpt\2\3>\n\t<time>\1</time>\n</wpt>|
$!G
s| = ([-.0-9]+)|="\1"|g

그리고 그것을 사용

sed -Ef script.file log.file

chmod +x ./script.file또는 다음과 같이 실행 가능하게 만드는 경우

./script.file log.file

관련 정보