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

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

検証して確認する必要がある約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"

おすすめ記事