パターンを検索し、同じ名前のファイルを作成します。

パターンを検索し、同じ名前のファイルを作成します。

私の使い方は次のとおりです。

grep -i '"location_country":"country name"' file.txt >> sample.txt

複数の国を含む大容量ファイルを検索しています。私が望むのは、国名を含むテキストファイルを動的に生成し、同じ国のすべての一致をそのファイルに保存することです。つまり、country name.txt毎回表示されます。

このような

grep -i '"location_country":"(.+)"' file.txt >> \1.txt

データ例:

{"full_name":"name1","location_country":"united kingdom"}
{"full_name":"name2","location_country":"united states"}
{"full_name":"name3","location_country":"china"}

したがって、国名を含む3つの別々のテキストファイルを作成する必要がありますunited kingdom.txt。たとえば、次のようになります。

{"full_name":"name1","location_country":"united kingdom"}

私はすでにbashスクリプトを使用しているので気にしません。どうすればいいですか?私はLinuxマシンを使用しています。

ベストアンサー1

ファイルは一連の JSON オブジェクトで構成されます。各オブジェクトには.location_countryキーが含まれています。キー値と呼ばれるファイルにオブジェクト自体のシリアル化されたコピーを書き込む各オブジェクトにシェルコマンドを作成できます.location_country。その後、これらのシェルコマンドをシェルで実行できます。

使用jq

jq -r '"printf \"%s\\n\" \(. | @json | @sh) >\(.location_country|@sh).txt"' file.txt

@jsonjq直列化されたオブジェクトは、入力文書(この場合は現在のオブジェクト)を含むJSONエンコーディング文字列をエクスポートするin演算子を使用して生成できます。次に、@sh文字列として入力してシェルを正しく引用します。この演算子は、キー値に基づいて部分出力ファイル名を作成するためにも@sh使用されます。.location_country

このコマンドはデフォルトで呼び出し、printf現在のオブジェクトを出力し、出力を特定のファイルにリダイレクトするシェルコードを生成します。

のサンプルデータが与えられたら、file.txt以下をエクスポートします。

printf "%s\n" '{"full_name":"name1","location_country":"united kingdom"}' >'united kingdom'.txt
printf "%s\n" '{"full_name":"name2","location_country":"united states"}' >'united states'.txt
printf "%s\n" '{"full_name":"name3","location_country":"china"}' >'china'.txt

これを別のファイルにリダイレクトして実行してshコマンドを実行したり、evalシェルで直接使用したりできます。

eval "$( jq ...as above... )"

正しいJSONパーサーを使用しているため、jq上記のコードは入力JSON文書が1行に1つのオブジェクトとしてフォーマットされていない場合でも機能します。

$ cat file.txt
{
  "full_name": "name1",
  "location_country": "united kingdom"
}
{
  "full_name": "name2",
  "location_country": "united states"
}
{
  "full_name": "name3",
  "location_country": "china"
}
$ jq -r '"printf \"%s\\n\" \(. | @json | @sh) >\(.location_country|@sh).txt"' file.txt
printf "%s\n" '{"full_name":"name1","location_country":"united kingdom"}' >'united kingdom'.txt
printf "%s\n" '{"full_name":"name2","location_country":"united states"}' >'united states'.txt
printf "%s\n" '{"full_name":"name3","location_country":"china"}' >'china'.txt
$ eval "$( jq -r '"printf \"%s\\n\" \(. | @json | @sh) >\(.location_country|@sh).txt"' file.txt )"
$ ls
china.txt           file.txt            united kingdom.txt  united states.txt
$ cat 'united kingdom.txt'
{"full_name":"name1","location_country":"united kingdom"}

おすすめ記事