jq -- 有效地用另一个文件中的值替换一个文件中的值

问题描述 投票:0回答:1

我有两个大文件,每个包含数百万行

**FILE 1** 

{"key1": "value1", "key2": "val1"}
{"key1": "value2", "key2": "val2"}
{"key1": "value3", "key2": "val3"}
**FILE 2**

{"f2key1": "fvalue1", "fkey2": "file2val1"}
{"f2key1": "fvalue2", "fkey2": "file2val2"}
{"f2key1": "fvalue3", "fkey2": "file2val3"}

FILE 1行中的数据需要在FILE 2的相应行中,它包含大型复杂记录,每条记录一行。换句话说,FILE 2的第一条记录(第1行)需要FILE 1第1行的数据,FILE 2的第二条记录(第2行)需要FILE 1第2行的数据,第9,999,999行的数据FILE 2 的第 9,999,999 行的记录中需要 FILE 1.

预期产出

{"fkey1": "val1", "fkey2": "value1"}
{"fkey1": "val2", "fkey2": "value2"}
{"fkey1": "val3", "fkey2": "value3"}

文件太大,无法加载到内存中,但重组以简化流程是可以接受的。

jq
1个回答
0
投票

IIUC,两个文件都被格式化为每行包含一个对象(如果不是,请使用

jq -c
来实现它),并且您希望通过从第二个文件中获取键来合并顺序对应的行/对象,以及从首先。

至于顺序对齐,可以使用GNU的

paste
(默认分隔符
\t
不干扰),然后使用
jq
.
(没有
input
标志),并根据您的需要进行合并。
至于具体的合并,我其实从你的例子中无法理解逻辑。但为了演示,我将分别使用 

-n

keys_unsorted
获取对象中顺序出现的键和值,然后使用
map
迭代地将它们组合在一起(导致翻转键 -值对应于您的样本输出)。
最后,要恢复每行一个对象的格式,请再次使用 

reduce

标志。

-c

< <(paste file1.json file2.json) jq -c '
  map(.) as $values | input | reduce (keys_unsorted | to_entries)[]
    as {$key, $value} (.; .[$value] = $values[$key])
'
© www.soinside.com 2019 - 2024. All rights reserved.