我有两个大文件,每个包含数百万行
**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"}
文件太大,无法加载到内存中,但重组以简化流程是可以接受的。
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])
'