2012-10-02 68 views
1

任何人可以幫我SED得到的時間,緯度和經度根據以下文字SED提取物價值

{"class":"TPV","tag":"MID2","device":"/dev/ttyUSB0","mode":3,"time":"2012-10-02T10:43:21.000Z","ept":0.005,"lat":55.190682291,"lon":25.265912847,"alt":19.149,"epx":58.300,"epy":74.796,"epv":144.575,"track":148.2723,"speed":1.623,"climb":-1.471,"eps":149.59} 

回答

0

這是相當瑣碎與GNU awk

awk -F, '{ for (i=1; i<=NF; i++) if ($i ~ /time|lat|lon/) { match($i, /^\"([^\"]+)\":\"?([^\"]+)\"?/, array); printf "%s: %s\n", array[1], array[2] } }' file.txt 

結果:

time: 2012-10-02T10:43:21.000Z 
lat: 55.190682291 
lon: 25.265912847 
+0

awk -F,'{如果(i = 1; i <= NF; i ++)if($ i〜/ time | lat | lon /){match($ i,/^\「([^ \」] +):「 ([^ \「] +)\」?/,array); printf「%s:%s \ n」,array [1],array [ 2]}}'/tmp/gpsdata-clean.txt : : : – dannymagat

+0

非常感謝你 – dannymagat

+0

@ user1679990:如果這個或其他答案在這裏爲你工作,你應該考慮接受它。要做到這一點,請點擊您最喜歡的答案左側的勾號。乾杯。 – Steve

1
$ grep -oP '"lat":\K[\d.]+' file 
$ grep -oP '"lon":\K[\d.]+' file 
$ grep -oP '"time":"\K[^"]+' file 
0

我會做(作爲sed腳本)的值:

#!/bin/sed -f 

h;G;G 

s/[^\n]*"lat"\s*:\s*\([0-9.]*\)[^\n]*/\1/ 
s/[^\n]*"lon"\s*:\s*\([0-9.]*\)[^\n]*/\1/ 
s/\n[^\n]*"time"\s*:\s*"\([^"]*\)".*$/\ 
\1/ 

第一行三個命令(h;G;G)將行復制兩次。它通過用「h」命令將輸入​​行復制到輔助緩衝區(稱爲保持空間)中,然後使用「G」命令將該保持空間的內容附加到模式空間(即工作緩衝區) ,兩次。現在我們有三行這一行。

爲了簡化和更加普遍,有三個獨立的命令來提取數據,但格式類似:

  1. 跳過一些字符,直到我們找到了鑰匙。請注意,我們必須跳過前兩個命令中不是換行符([^\n]*)的字符,否則它們會影響它們下面的行,作爲其貪婪行爲的後果(即,如果在查找"lat",您將跳過前兩行,因爲第三行也包含"lat")。在最後一個命令中,您可以跳過任何字符(.*),但您必須先跳過換行符以防止它與前面的行匹配。
  2. 跳過鍵
  3. 跳過零個或多個空白字符(\s*
  4. 跳過結腸
  5. 跳過多個可選的空白字符
  6. 捕獲數據。捕獲由反斜槓括號(即\(\))指定,並且它會將與括號之間的表達式匹配的輸入存儲到名爲\1的輔助「變量」中(如果您有多個捕獲組,則第二個將被稱爲\2,第三個\3,等等直到\9)。在前兩個命令中,我們匹配一系列數字或句點([0-9.]*)。在最後一個命令中,我們捕獲任何不是雙引號的字符([^"]*"),但我們也會在捕獲組之後跳過一個雙引號(即跳過打開和關閉的雙引號)。
  7. 跳過更多字符。我們可以跳過儘可能多的不是換行符的字符,所以我們有效地跳到了行尾。

最後,在每個命令中,我們用捕獲結果替換匹配。在最後一條命令中,因爲我們匹配並因此跳過分隔第二行和第三行的換行符,所以我們必須將其包含在替換行中。爲了包含它,我們必須在它之後添加一個反斜槓和一個實際的換行符。這就是爲什麼替換分爲兩行。

希望這有助於=)

+0

貓/tmp/gpsdata-clean.txt | /根/測試 25.265912847 2012-10-02T13:35:43.000Z 現在顯示經緯度:55.190682291 – dannymagat

+0

對不起,我不理解您的評論。您測試的輸入行是什麼?對第三個替換命令稍作修改,可能有幫助嗎? –

+0

時間和緯度顯示,但lon不是 – dannymagat

1

隨着egrep的和sed

<infile egrep -o '"(lat|lon|time)":"?[^,]*' | sed 's/[^:]*://' 

輸出:

"2012-10-02T10:43:21.000Z" 
55.190682291 
25.265912847 

追加tr -d '"'的管道,如果你不喜歡雙引號。

隨着SED單獨

<infile sed -r 's/"(lat|lon|time)":"?([^,"]*)/\n\2\n/g' | sed -n '2~2p' 

輸出:

2012-10-02T10:43:21.000Z 
55.190682291 
25.265912847 

第一SED中隔離相匹配,以便他們將每隔一行,第二個挑選出來。

隨着TR和grep

<infile tr ',' '\n' | grep 'time\|lon\|lat' 

輸出:

"time":"2012-10-02T10:43:21.000Z" 
"lat":55.190682291 
"lon":25.265912847