【问题标题】:Shell Script not appending, instead it's erasing contentsShell 脚本不附加,而是删除内容
【发布时间】:2019-02-15 10:01:49
【问题描述】:

我的目标是用 .txt 文件中的用户名列表卷曲我新创建的 API,然后接收 API 响应,将其保存到 .json,最后创建一个 .csv(为了更容易阅读) .

这是我的脚本:

echo "$result" | jq 'del(.id, .Time, .username)' | jq '{andres:[.[]]}' > newresult

输入:sudo bash script.sh usernames.txt 用户名.txt:

test1
test2
test3
test4

结果:

"id","username"
4,"test4"

期望的结果:

"id","username"
1,"test1"
2,"test2"
3,"test3"
4,"test4"

它根据需要创建文件,甚至保存结果。但是,它只输出 1 个结果。我可以在 CSV/Json 运行时打开它,并看到它正在查询不同的用户名,但是当它开始另一个查询时,而不是将其全部附加到同一个文件中,它会删除 Newresult、Result.json、Results.csv、并创建新的,这意味着最后,我只得到一个用户名的结果,而不是例如 5 个列表。有人可以告诉我我做错了什么吗?

谢谢!

【问题讨论】:

  • >预期附加。它的文档明确表示它会截断。
  • ...也就是说,这段代码真的可以在很大程度上被重写——做一大堆就地操作真的很糟糕。如果您喜欢jq,也许将逻辑转移到一个 jq 调用中,而不是涉及这么多 shell?这段代码中有很多东西,比如cat x | sponge x,只是没有明显的目的或用途。请参阅minimal reproducible example 指南——问题中的代码应该是尽可能短的代码,让其他人在自己运行时看到手头的问题(显然,有人无法运行依赖于example.com他们自己)。
  • ...srsly,虽然——我认为这段代码没有理由多次调用jq,在那个实例中完成所有工作。但是,要实际提供一个经过测试的示例,我们需要 API 结果,这些结果未包含在此处(但是如果不可能将问题简化为根本不包含任何 API 使用) minimal reproducible example 包含,也许通过将 curl 替换为仅返回硬编码示例文档的函数。
  • 有关构建最短的代码以让其他人重现问题的进一步指导,请参阅sscce.org 的“修剪技巧”部分。

标签: bash shell sed sh cat


【解决方案1】:

使用>> 附加到文件。试试:

    : >results.csv
    for ligne in $(seq 1 "$nbrlignes");
    do
        ...
        jq -r '
        ["id", "username"] as $headers
            | $headers, (.andres[][] | [.[$headers[]]]) | @csv
        ' < result.json >> results.csv
    done

通过使用&gt;,您可以在每次循环运行时覆盖文件。
此外,您的脚本看起来应该在很大程度上被重写和简化。

【讨论】:

  • 谢谢!工作!还有,不知道从何说起。它可以工作,如果它没有损坏,请不要修复它!
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2023-04-02
  • 2012-05-16
  • 2012-03-12
  • 1970-01-01
  • 2021-02-13
  • 1970-01-01
  • 2020-03-22
相关资源
最近更新 更多