【问题标题】:read the first line of a text file with JQ用 JQ 读取文本文件的第一行
【发布时间】:2021-04-09 19:46:24
【问题描述】:

尝试查看如何使用 jq 读取文本文件的第一行

我有一个带有一堆 id 的文本文件(newfile.txt)

5584157003
5584158003
5584159003
5584160003

id 希望能够用 jq 读取第一行。

我试过这样做

cat newfile.txt | jq '.[0]'

但是得到一个错误

jq: error (at <stdin>:482): Cannot index number with number

我希望能够逐行阅读,以便我最终可以使用该 ID 运行查看并能够使用它做一些事情。有什么想法吗?

【问题讨论】:

    标签: linux bash jq


    【解决方案1】:

    使用-R 参数(又名--raw-input)告诉jq 它以字符串而不是JSON 形式接收输入,并使用input 一次只读取一个项目。因此:

    jq -Rn input <yourfile
    

    ...将输出:

    "5584157003"
    

    如果您想将其转换为数字,这就是 tonumber 的用途:

    jq -Rn 'input | tonumber' <yourfile
    

    ...将输出:

    5584157003
    

    【讨论】:

    • 仅阅读第 2 行怎么样,是否有参数可以传递到此处以使用 jq 执行此操作?
    • [input, input] 会给你一个只有两行的列表。如果您愿意,您也可以丢弃第一行而只阅读第二行。为了清楚起见,在这种特殊情况下,我可能会将其写为jq -Rn 'input as $ignore | input';循环并忽略特定数量的项目,相比之下,我可能会使用减速器。
    • 有没有办法专门检索行号?例如第 3 行? 5584159003
    • 您可以阅读整个文件,还是只想阅读所需的行数?
    • 我最终要做的是从这个文件中一个一个地获取每个行号并使用 bash 进行 api 调用。
    【解决方案2】:

    有没有办法专门检索行号?例如第 3 行?

    如果不需要进行任何转换,那么使用sed 可能是最简单、最有效的方法;如果需要进行简单的转换,那么除了sedawk 可能值得考虑,但 jq 在某些情况下也可能值得考虑。

    特别是,如果考虑到效率,那么使用 jq 的 nth 过滤器是有意义的,如下所示:

    jq --argjson n 3 -nR 'nth($n - 1; inputs)' newfile.txt 
    

    这种方法将避免读取超出指定行的行。

    nth 从 0 开始计数。)

    您可能还想使用 jq 的 -r 选项。

    【讨论】:

      【解决方案3】:

      我最终要做的是从这个文件中一个一个地获取每个行号,然后使用 bash 进行 api 调用。

      对于这样一个简单的任务,您可以简单地使用 bash 的 read,类似于

      while IFS= read -r line ; do ... done < newfile.txt
      

      但是,如果需要对输入行进行任何类型的转换,则 jq 可能是合适的,例如如果这些行必须是 URL 编码的。这可以使用inputs 结合 jq 的 -n 和 -R 命令行选项来完成,如下所示:

      while IFS= read -r line ; do 
      ... 
      done < <(jq -Rrn 'inputs|@uri' newfile.txt)
      

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 2020-07-01
        • 1970-01-01
        • 2014-12-10
        • 1970-01-01
        • 1970-01-01
        • 2013-04-17
        • 2010-12-26
        相关资源
        最近更新 更多