ログファイルを処理していますが、各行を並べ替え(並べ替えではない)する必要があります。ログファイルは次のとおりです。
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