Учитывая документ JSON, который вы показываете:
$ jq -r 'path(.[][][]) as $p | "\($p|join(":")):\(getpath($p).MeltingPoint):\(getpath($p).BoilingPoint)"' file.json
Metals:AlkaliMetals:Lithium:453:1615
Metals:AlkaliMetals:Sodium:371:1156
Metals:AlkalineEarthMetals:Beryllium:1560:2743
Metals:AlkalineEarthMetals:Magnesium:923:1363
Metalloids:Metaloids:Boron:2348:4273
Metalloids:Metaloids:Silicon:1687:3173
Это перебирает «пути» всех объектов на уровне 3 документа (, то есть пути к структурам Lithium
, Sodium
и т. д. )как $p
. Каждый $p
представляет собой массив, подобный ["Metals","AlkaliMetals","Sodium"]
. Он использует текущий путь для создания начальной части каждой выходной строки, соединяя путь с :
в качестве разделителей. Фактические температуры кипения и плавления извлекаются с помощью getpath()
из текущего пути, а значения добавляются в конец строки.
Похоже, это также работает с большим файлом, на который вы ссылаетесь, но выводит null
для отсутствующих данных о температуре.
mktemp
заменяет последний запуск крестиков в шаблоне:
The final run of ‘X’s in the template will be replaced by alpha-numeric character
Самый простой вариант — использовать
mktemp "/tmp/1556580619403-0/duplicate.$filename.XXXXXXX"
Если вам действительно нужно, чтобы оно заканчивалось исходным именем файла, используйте опцию --suffix
:
mktemp /tmp/1556580619403-0/duplicate.XXXXXXX --suffix ".$filename"