テキストファイルから数字を抽出するのに問題があります。デフォルトでは次のようになります(すべて1行に表示されます。読みやすくするためにここでは区切ります)。
[{"id":1,"width":720,"height":480,"longitude":20.104258199768,"timestamp":1510690197540,"frame_content":"some other informations...},
{"id":2,"width":720,"height":480,"longitude":20.104258199768,"timestamp":1510690197552,"frame_content":"some other informations...},
{"id":3,"width":720,"height":480,"longitude":20.104258199768,"timestamp":1510690197556,"frame_content":"some other informations...},
{"id":4,"width":720,"height":480,"longitude":20.104258199768,"timestamp":1510690197558,"frame_content":"some other informations...},
and so on.....]
私がやりたいことは、タイムスタンプタグの後のすべての値を抽出することです。問題は私です。ファイルは1行だけで構成されます。これにより少しトリッキーになり、変更できないようです。インターネット上で解決策を見つけてsed
コマンドを試しましたが、これまでは成功しませんでした。grep
この問題のお手伝いをいただきありがとうございます:)
ありがとうございます!
答え1
ファイルが正しい形式のJSONファイルであると仮定すると、JSONパーサーを使用して解析する必要があります。
使用jq
ファイルのJSONパーサー:
$ jq '.[] | .timestamp' filename.json
1510690197540
1510690197552
1510690197556
1510690197558
この式は、.[] | .timestamp
配列内のすべてのオブジェクトに対して暗黙的なループを作成し、timestamp
各オブジェクトから値を抽出します。
次のように書くこともできます。
$ jq '.[].timestamp' file.json
無関係:
id
最大値を持つオブジェクトを見つけるにはtimestamp
:
$ jq 'max_by(.timestamp).id' file.json
4
JSONファイルをきれいに印刷するには:
$ jq . file.json
答え2
あなたはそれを使用することができます
grep -oP '"timestamp":\s*\K\d+' filename
すべてが1行にあることは重要ではありません。 "timestamp:" 文字列の後に表示されるすべての数字を検索します。
結果:
1510690197540
1510690197552
1510690197556
1510690197558
答え3
奇妙な解決策:
awk -F, '{ for (i=1;i<=NF;i++) { if ($i~/timestamp/) { split($i,slt,":");print slt[2] } } }' filename
結果:
1510690197540
1510690197552
1510690197556
1510690197558
カンマで区切られた各フィールドを繰り返し、フィールドとパターンをタイムスタンプと一致させます。一致するものがある場合は、次のようにフィールドを配列sltに分割します。次に、配列の2番目の要素を印刷します。