2016-04-19 9 views
-2

ファイルサイズが約500MBであり、各行に以下のようなデータがあります。Bash:vimモードでのファイルサイズの処理に問題があります

#vim results.txt 
{"count": 8, "time_first": 1450801456, "record": "A", "domain": "api.ai.", "ip": "54.240.166.223", "time_last": 1458561052} 
{"count": 9, "time_first": 1450801456, "record": "A", "domain": "cnn.com.", "ip": "54.240.166.223", "time_last": 1458561052} 
......... 

25万行が合計です。

今、私は、カウント、time_first、記録、ドメイン、IP、time_lastなどの不要な文字列を除去することにより、

8,1450801456,A,api.ai,54.240.166.223,1458561052 
9,1450801456,A,cnn.com,54.240.166.223,1458561052 
.... 

としてresults.txtファイルを保持したいと思います。

今、vimモードでは、すべての文字列をすべて削除しています。たとえば、%s/{"count": //gとします。

1つの文字列の場合、それを置き換えるのにさらに時間がかかりました。

私はBash/shellの初心者です。どうすればsed/awkを使ってこれを行うことができますか?何か提案してください? SEDで

+2

先験的なgoogle検索を実行すると、数千のawkとsedの例が簡単に見つかります。彼らはいくつかのあいまいな図書館ではありません – redFIVE

+0

あなたはこのタイプのファイルを日/週/月に一度入手しますか?またはそれは一度のものですか?一度のことなら、確かにvim。そうでなければ、sed。 –

+0

@JavierBuzziこれは処理のために私に来る頻繁なデータ(毎日)です。 – Arun

答えて

4

sed -E 's/[{ ]*"[^"]*": *|["}]//g' file 
# ^^^  ^^---- remaining double quotes and the closing bracket 
# | | |   '----- OR 
# | | '--------------- key enclosed between double quotes 
# | '-------------------- leading opening curly bracket and spaces 
# '------------------------- use ERE (Extended Regular Expression) syntax 

その他の方法:一緒にフィールドに参加するsedを必要としない@BeniBelaから

xidel -q file -e '$json/*' | sed 'N;N;N;N;N;y/\n/,/' 
# ^  ^ ^  ^  ^---- translate newlines to commas 
#  |   |  |   '-------------- append the next five lines 
#  |   |  '------------------------ all values 
#  |   '------------------------------ for each json string 
#  '------------------------------------------ quiet mode 

短い方法:JSONパーサーを含んxidelを使用して

xidel -q file -e '$json/join(*,",")' 
+0

xidel何かが私のために新しいと同様に学ぶ。共有してくれてありがとう。 – Arun

+1

@Arun:xidelはunix/linuxの一般的なツールではないので、インストールする必要があります。このユーティリティはJSON、XML、HTMLのために非常に便利で強力で耐性があるので、私はその方法を追加しました。 –

+0

これは私のLinuxマシンにインストールされ、私の作品のほとんどでそれを使いこなそうとします。ありがとう – Arun

3

何か考慮する:

$ awk -F'[{}":, ]+' -v OFS=, '{for (i=3;i<NF;i+=2) printf "%s%s", $i, (i<(NF-1)?OFS:ORS)}' file 
8,1450801456,A,api.ai.,54.240.166.223,1458561052 
9,1450801456,A,cnn.com.,54.240.166.223,1458561052 

Arnold RobbinsによるEffective Awk Programming、第4版を入手してください。

+0

エド:たくさんありがとうございました。最後にsedを使って試してみましょう:sed -i 's/{"count":// g; s/"time_first":// g; s/"rrtype":// g; s/"rrname":// g; s/"rdata":// g; s/"time_last":// g 's /} // g' test.txt – Arun

+1

参考にしていただきありがとうございます。 –

+2

@Arunそこにすべてのテキスト文字列をハードコードする必要はありませんが、ANYツールの正しいアプローチは、それぞれの行の相対位置を使用するか、正規表現を定義して、必要なものを選択します。 –

関連する問題