ディレクトリ内の複数のテキストファイルから特定の文字列の後にあるすべてのテキストを削除します。

ディレクトリ内の複数のテキストファイルから特定の文字列の後にあるすべてのテキストを削除します。

検証して確認する必要がある約25,000個のJSONファイルがあり、Excelを使用してJSONをCSVに変換すると一部のファイルが重複してエラーが発生することがわかりました。

それ以降のすべての文字列を削除しようとしています。"version":"0.2.3"}これは、繰り返される前にJSONの終わりを示すためです。"version": "0.2.3"}{"analysis": {したがって、それ以降のすべてのエントリを保持し"version": "0.2.3"}て削除し、その変更を25,000ファイルすべてに適用する必要があります。{"analysis": {人々がgrepとsedを使っているのを見たことがありますが、それを自分で動作させることはできないようです。

誰かが助けてくれたら感謝します。テキストを手動で削除することは望ましくないので、bashなどにライナーがあることを願っています!

以下は変更する必要があります(ファイルの1つの削除されたバージョン)、以下は必要な出力です。ご覧のとおり、何らかの理由でAPIの使用中にJSONデータを独自にコピーできます。

問題のある入力(切り捨てjson):

{"analysis":{"score":3},"sample":{"completed":"2022-01-27T21:22:21Z","created":"2022-01-27T21:17:57Z","id":"220127-z5h84saffl","md5":"7871a75734af389b787bad57a3ea087d","score":3,"sha1":"58a8689ee76a46559ea56a52d20425f44c8ff601","sha256":"23c5dee027c7969aabb5828641c55a005f30fb166a5006dbe3a817f56ca0e32a"},"version":"0.2.3"}{"analysis":{"score":3},"sample":{"completed":"2022-01-27T21:22:21Z","created":"2022-01-27T21:17:57Z","id":"220127-z5h84saffl","md5":"7871a75734af389b787bad57a3ea087d","score":3,"sha1":"58a8689ee76a46559ea56a52d20425f44c8ff601","sha256":"23c5dee027c7969aabb5828641c55a005f30fb166a5006dbe3a817f56ca0e32a"},"version":"0.2.3"}

希望の出力:

{"analysis":{"score":3},"sample":{"completed":"2022-01-27T21:22:21Z","created":"2022-01-27T21:17:57Z","id":"220127-z5h84saffl","md5":"7871a75734af389b787bad57a3ea087d","score":3,"sha1":"58a8689ee76a46559ea56a52d20425f44c8ff601","sha256":"23c5dee027c7969aabb5828641c55a005f30fb166a5006dbe3a817f56ca0e32a"},"version":"0.2.3"}

答え1

(ほとんどのUnixシリーズシステムで動作します)を使用すると、jqファイルから最初のJSONオブジェクトを抽出し、次を使用して残りを破棄できます。

jq -n 'input' file >newfile

これにより、「きれいな印刷」JSONが作成されます。-c「単純な」出力(スペースが最小化された単一行)を取得するには、このオプションを使用します。出力はに記録されますnewfile

このjqディレクティブは、input次の利用可能なJSONオブジェクトを生成します。-n()を使用して--null-input基本データの読み取りをオフにし、input入力ファイルの最初のオブジェクトのみを処理します。

質問に提供されたデータについて、これは次のようになります。

{
  "analysis": {
    "score": 3
  },
  "sample": {
    "completed": "2022-01-27T21:22:21Z",
    "created": "2022-01-27T21:17:57Z",
    "id": "220127-z5h84saffl",
    "md5": "7871a75734af389b787bad57a3ea087d",
    "score": 3,
    "sha1": "58a8689ee76a46559ea56a52d20425f44c8ff601",
    "sha256": "23c5dee027c7969aabb5828641c55a005f30fb166a5006dbe3a817f56ca0e32a"
  },
  "version": "0.2.3"
}

その後、元のファイルを結果で上書きします。単一ファイルの全体的な処理は次のとおりです。

jq -n 'input' file >newfile &&
mv newfile file

ファイルが現在のディレクトリにあり、特定のパターンと一致すると仮定すると、単純な*.jsonシェルループですべてのファイルを次のように処理できます。

for name in *.json; do
    cp -- "$name" "$name.orig" &&
    jq -n 'input' <"$name.orig" >"$name"
done

これは私が示したものとは少し異なり、元のコンテンツを.origファイル名サフィックスを使用してファイルに保存し、元のファイルのメタデータ(権限など)が変更されないようにします。これを正しく行ったと確信したら、.origファイル名のサフィックスが付いたファイルを削除できます。

必ず適切にバックアップされたデータに対してこれらのテストを実行してください。


また、これらのファイルをCSVに変換すると言っていましたが、何が必要なのかは言及していません。sampleキーをヘッダーとして使用してデータをCSV形式にしたいとします。

jq -n -r 'input | .sample | keys, [.[]] | @csv' file

JSON文字列の代わりにデコードされたデータを提供するには、Option()が必要です-r--raw-output

特定の文書について以下を提供します。

"completed","created","id","md5","score","sha1","sha256"
"2022-01-27T21:22:21Z","2022-01-27T21:17:57Z","220127-z5h84saffl","7871a75734af389b787bad57a3ea087d",3,"58a8689ee76a46559ea56a52d20425f44c8ff601","23c5dee027c7969aabb5828641c55a005f30fb166a5006dbe3a817f56ca0e32a"

答え2

使用幸せ(以前のPerl_6)

入力例(無効なJSON):

~$ cat file.json
{"analysis":{"score":3},"sample":{"completed":"2022-01-27T21:22:21Z","created":"2022-01-27T21:17:57Z","id":"220127-z5h84saffl","md5":"7871a75734af389b787bad57a3ea087d","score":3,"sha1":"58a8689ee76a46559ea56a52d20425f44c8ff601","sha256":"23c5dee027c7969aabb5828641c55a005f30fb166a5006dbe3a817f56ca0e32a"},"version":"0.2.3"}{"analysis":{"score":3},"sample":{"completed":"2022-01-27T21:22:21Z","created":"2022-01-27T21:17:57Z","id":"220127-z5h84saffl","md5":"7871a75734af389b787bad57a3ea087d","score":3,"sha1":"58a8689ee76a46559ea56a52d20425f44c8ff601","sha256":"23c5dee027c7969aabb5828641c55a005f30fb166a5006dbe3a817f56ca0e32a"},"version":"0.2.3"}

出力例(Rakuのハッシュ形式):

~$ cat file.json | raku -MJSON::Stream -e 'my @a;  \
   react whenever json-stream($*IN.Supply, [q[$], *][0],) {@a.push($_.values)};  \
   "\n".print; .say for @a.[0].hash;'

sample => {completed => 2022-01-27T21:22:21Z, created => 2022-01-27T21:17:57Z, id => 220127-z5h84saffl, md5 => 7871a75734af389b787bad57a3ea087d, score => 3, sha1 => 58a8689ee76a46559ea56a52d20425f44c8ff601, sha256 => 23c5dee027c7969aabb5828641c55a005f30fb166a5006dbe3a817f56ca0e32a}
version => 0.2.3
analysis => {score => 3}

上記では、Rakuのモジュールを使用して不完全なJSONを読み取ることができますJSON::Stream。これはJSONストリームパーサ(EOFに到達する前に解析)なので、JSONを検証しないためです。この場合は幸運でした。配列から誤った2番目の要素を削除するには、呼び出しを使用します@a.[0].hash@a.head.hashまた動作します)。


最終フォーマットの出力は、RakuモジュールのコマンドをJSON使用して行われます。全体的に私たちがしたことは次のとおりです。to-json()JSON::Tiny

最終的なJSON出力(Rakuモジュールのみを使用):

~$ cat Jarvis4444.json | raku -MJSON::Stream -MJSON::Tiny -e 'my @a;  \
   react whenever json-stream($*IN.Supply, [q[$], *][0],) {@a.push($_.values)};  \
   "\n".print; to-json(@a.[0].hash).put;'

{ "version" : "0.2.3", "sample" : { "score" : 3, "created" : "2022-01-27T21:17:57Z", "sha1" : "58a8689ee76a46559ea56a52d20425f44c8ff601", "id" : "220127-z5h84saffl", "sha256" : "23c5dee027c7969aabb5828641c55a005f30fb166a5006dbe3a817f56ca0e32a", "md5" : "7871a75734af389b787bad57a3ea087d", "completed" : "2022-01-27T21:22:21Z" }, "analysis" : { "score" : 3 } }

他の答えと比較するために、上記のJSON出力を|パイプすることができますjq

{
  "sample": {
    "completed": "2022-01-27T21:22:21Z",
    "score": 3,
    "sha1": "58a8689ee76a46559ea56a52d20425f44c8ff601",
    "md5": "7871a75734af389b787bad57a3ea087d",
    "id": "220127-z5h84saffl",
    "sha256": "23c5dee027c7969aabb5828641c55a005f30fb166a5006dbe3a817f56ca0e32a",
    "created": "2022-01-27T21:17:57Z"
  },
  "version": "0.2.3",
  "analysis": {
    "score": 3
  }
}

[複数のファイル処理:もちろん、@Kusalanandaの答えは、複数のファイルを処理するためのシェルループを作成し、各ファイルを変更/保存するための十分なガイドラインを提供します。]

https://github.com/moritz/json
https://github.com/FCO/JSON-Stream
https://raku.org

関連情報