私の使い方は次のとおりです。
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
@json
jq
直列化されたオブジェクトは、入力文書(この場合は現在のオブジェクト)を含む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"}