如何在 bash 中使用引号而不是空格将数组与命令分开

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

好吧,我目前正在编写一个 bash 脚本来搜索 mario 制造商级别数据的 jsonl 文件(可以在这个 reddit 帖子https://www.reddit.com/r/MarioMaker/comments/wlkwp9/easily_searchable_database_of_super_mario_maker_1/ 中找到)并打印级别 ID、课程名称和创建者姓名。然而,当我尝试打印所有找到的信息时遇到了问题,因为我得到的数组是使用课程名称中的空格而不是新行或引号来分隔的。下面是我当前的代码,用于将 id 转换为游戏中 id 的 python 脚本,以及 jsonl 文件中的单个条目(其超过 16GB 的原始文本)

Bash 脚本:

#!/bin/bash
ids=$(grep $1 /path/to/file/courses.jsonl | awk -F ',' '{print $1}' | awk -F ':' '{print $2}')
cns=$(grep $1 /path/to/file/courses.jsonl | awk -F ',' '{print $5}' | awk -F ':' '{print $2}')
crs=$(grep $1 /path/to/file/courses.jsonl | awk -F ',' '{print $7}' | awk -F ':' '{print $2}')
for id in $ids; do
        idn=$(python3 /path/to/file/mmid.py $id)
        ida+=($idn)
done

for i in "${!ida[@]}"; do
        printf "ID: %s\n" "${ida[i]}"
        printf "Course Name: %s\n" "${cns[i]}"
        printf "Creator Name: %s\n" "${crs[i]}"
        printf "\n"
done

Python 脚本(代码主要取自上述 reddit 线程)

import struct
import hashlib
import hmac
import sys
idno = int(sys.argv[1])
key = hashlib.md5(b"9f2b4678").digest()
data = struct.pack("<Q", idno)
checksum = hmac.HMAC(key, data, 'md5').digest()
checksum = checksum[3:1:-1].hex().upper()
idstring = str.upper(hex(idno))[2:]
for y in range(8 - len(idstring)):
    idstring = '0' + str(idstring)
code = str(checksum) + '0000' + str(idstring)
print(code)

courses.jsonl 中的示例条目

{"id":66782542,"retrieval_date":"2021-06-02T02:40:10.837452Z","url":"https://d2sno3mhmk1ekx.cloudfront.net/10.WUP_AMAJ_datastore/ds/1/data/00066782542-00001?Expires=1625193610&Signature=vh50sqvoN2u-Xu~uT2pYJMNzj1kV11NDt77BDC2UM5o9VtTz-3HNxheiWc~PxDJhCqDNL-M7u9qrFnQ6FkOxDTyzo3QrK1VcNDqoAFRKA2RL03au-FdN9daY4~CDeKS3TvEkpzqBGe9fZfwlz6S-z7~VwRLsjPbw26QSkeszZOdGNT75RWyx2jeqKYpcjzi4tagbiWwq0DzbHzaXjlIpYpTsHIPaemS0fpad0d-Hgv56R-c3BCt2rzCoxco~jpVO2FW2HZoQRJIPU0mwbZE0wLlpKEHMwEcOoUbRIbYP~5U4XFwc6eahHc19GRjttzNDHBm68u9yhi3BVjlaMnRm2g__&Key-Pair-Id=APKAJUYKVK3BE6ZPNZBQ","stars":1,"course_name":"go","creator":{"pid":1753458969,"nnid":"Khanna1974","mii_data":"QlBGQwAAAAEAAAAAAAAAAAAAAAAAAQAAAwAAQLAAeGTApABA1vjUsH+qXdiADAAAcxVNAGEAcgBpAAAATQBFAAAAAAAAAEBAAACDAUJoRBggNEYUgRIBaA0AACkAUiVBTQBhAHIAaQAAAAAAAAAAAAAAAAAAAI1HAAAAAAAAAAAAAAAAAAAAAAAAAAE="},"upload_time":"2019-08-19T19:53:26Z","user_plays":17,"clears":14,"total_attempts":27,"failures":13,"world_record":{"best_time_player":{"pid":1744579894,"nnid":"HifysWU","mii_data":"QlBGQwAAAAEAAAAAAAAAAAAAAAAAAQAAAAAAQMlEqo2ExqEA13Ajt2LjAh1dDQAAACBSAGEAdgBnAHoAAABFAAAAAAAAAH8oJgAiAIhGgxgTEoYUaxATZG0AACWCUUhQAAAAAAAAAAAAAAAAAAAAAAAAAAAAAGCXAAAAAAAAAAAAAAAAAAAAAAAAAAE="},"first_complete_player":{"pid":1744078322,"nnid":"hellodarknessyee","mii_data":"QlBGQwAAAAEAAAAAAAAAAAAAAAAAAQAAAAAAQPB5NCID5WIC2Pb9Wi0zXBWf6gAAARRSAG8AcwBlAAAATQBFAAAAAAAAAEBAMgCBBaBoYxKzMoUOoQwTZgwAKCG4OUhQAAAAAAAAAAAAAAAAAAAAAAAAAAAAAGK9AAAAAAAAAAAAAAAAAAAAAAAAAAE="},"best_time_ms":5129,"created_time":"2019-08-19T20:02:41Z","updated_time":"2019-08-20T18:41:32Z"}}

到目前为止,我已经尝试使用循环并将数据附加到新数组,并使用 eval 做基本相同的事情。

arrays string bash
1个回答
0
投票

我会使用

jq
做什么:

jq -r '"ID: \(.id), Course name: \(.course_name), Creator name: \(.creator.nnid)"' file.json

产量:

ID: 66782542, Course name: go, Creator name: Khanna1974
© www.soinside.com 2019 - 2024. All rights reserved.