RError.com

RError.com Logo RError.com Logo

RError.com Navigation

  • 主页

Mobile menu

Close
  • 主页
  • 系统&网络
    • 热门问题
    • 最新问题
    • 标签
  • Ubuntu
    • 热门问题
    • 最新问题
    • 标签
  • 帮助
主页 / 问题 / 867985
Accepted
1d0
1d0
Asked:2020-08-13 16:37:15 +0000 UTC2020-08-13 16:37:15 +0000 UTC 2020-08-13 16:37:15 +0000 UTC

rewiev:用awk解析时,改最后一行

  • 772

有一个脚本可以解析具有不同行数的 txt 文件:

project1 220EEOOBC45
project2 BC45220EEO3
project...
projectn 3563GFGFG34

并附加到json:

{ "name": "project1", "revision": "220EEOOBC45"},
{ "name": "project2", "revision": "BC45220EEO3"},
....
{ "name": "projectn", "revision": "3563GFGFG34"}]}

脚本:

 awk '{print "{ \"name\": \"" $1 "\", \"revision\": \"" substr($2,1,12) "\"},"}END{print "{ \"name\": \"" $1 "\", \"revision\": \"" substr($2,1,12) "\"}]}"}' info.txt >> result.json
 sed -i -n 'x;1b;$x;p' result.json

因此,json 文件的开头已经存在,任务只是添加它。我使用 awk,它在处理完最后一行后将其复制,但带有结束标签]}且没有逗号,然后 sed 删除倒数第二行重复的行。我认为这是一些非常奇怪的自行车。还有哪些其他选择或更合适的工作解决方案?不幸的是,不能使用jq或类似的。来自加或减 awk、sed、coreutils 类别的东西。

bash
  • 1 1 个回答
  • 10 Views

1 个回答

  • Voted
  1. Best Answer
    aleksandr barakin
    2020-08-13T23:42:00Z2020-08-13T23:42:00Z

    修正答案

    处理第一行时,可以从输出需要的字符开始(为避免输出换行符,可以使用运算符printf代替print):

    { if (NR==1) {printf "{["}; ... }
    

    结果文件中逗号分隔行的输出可以通过从主调用中删除来移动到处理下一行的开头printf:

    { if (NR==1) {printf "{["} else {print ","}; printf ... }
    

    好吧,在块中END{}您还可以显示最终字符:

    END {print "]}"}
    

    旧答案

    和块可以在程序中用于将第一行和最后一行添加到awk解释器的输出中。BEGIN{}END{}


    例子。

    有一个简单的awk程序:

    $ echo -e 'a\nb' | awk '{print}'
    a
    b
    

    向其中添加块,在输出{[的第一行之前输出一行,在输出]}的最后一行之后输出一行:

    $ echo -e 'a\nb' | awk 'BEGIN{print "{["} END{print "]}"} {print}'
    {[
    a
    b
    ]}
    

    如果您不能添加行,但需要在第一行和最后一行添加文本,那么使用sed解释器会更容易(比awk的情况) :

    $ echo -e 'a\nb' | sed '1s/^/{[/;$s/$/]}/'
    {[a
    b]}
    

    我将回答与评论完全不同的问题:

    行后逗号的问题。如果您使用 END,那么最后它将是 ,]} awk 根据模板构建并以逗号结束每一行,因此在 END 之后我在模板之外还有一行输出,没有逗号。

    在awk解释器的程序中,定义最后一行是相当麻烦的。但第一个是基本确定(变量NR存储输入文件的当前行号):

    if (NR!=1) {print ","}
    
    • 2

相关问题

Sidebar

Stats

  • 问题 10021
  • Answers 30001
  • 最佳答案 8000
  • 用户 6900
  • 常问
  • 回答
  • Marko Smith

    是否可以在 C++ 中继承类 <---> 结构?

    • 2 个回答
  • Marko Smith

    这种神经网络架构适合文本分类吗?

    • 1 个回答
  • Marko Smith

    为什么分配的工作方式不同?

    • 3 个回答
  • Marko Smith

    控制台中的光标坐标

    • 1 个回答
  • Marko Smith

    如何在 C++ 中删除类的实例?

    • 4 个回答
  • Marko Smith

    点是否属于线段的问题

    • 2 个回答
  • Marko Smith

    json结构错误

    • 1 个回答
  • Marko Smith

    ServiceWorker 中的“获取”事件

    • 1 个回答
  • Marko Smith

    c ++控制台应用程序exe文件[重复]

    • 1 个回答
  • Marko Smith

    按多列从sql表中选择

    • 1 个回答
  • Martin Hope
    Alexandr_TT 圣诞树动画 2020-12-23 00:38:08 +0000 UTC
  • Martin Hope
    Suvitruf - Andrei Apanasik 什么是空? 2020-08-21 01:48:09 +0000 UTC
  • Martin Hope
    Air 究竟是什么标识了网站访问者? 2020-11-03 15:49:20 +0000 UTC
  • Martin Hope
    Qwertiy 号码显示 9223372036854775807 2020-07-11 18:16:49 +0000 UTC
  • Martin Hope
    user216109 如何为黑客设下陷阱,或充分击退攻击? 2020-05-10 02:22:52 +0000 UTC
  • Martin Hope
    Qwertiy 并变成3个无穷大 2020-11-06 07:15:57 +0000 UTC
  • Martin Hope
    koks_rs 什么是样板代码? 2020-10-27 15:43:19 +0000 UTC
  • Martin Hope
    Sirop4ik 向 git 提交发布的正确方法是什么? 2020-10-05 00:02:00 +0000 UTC
  • Martin Hope
    faoxis 为什么在这么多示例中函数都称为 foo? 2020-08-15 04:42:49 +0000 UTC
  • Martin Hope
    Pavel Mayorov 如何从事件或回调函数中返回值?或者至少等他们完成。 2020-08-11 16:49:28 +0000 UTC

热门标签

javascript python java php c# c++ html android jquery mysql

Explore

  • 主页
  • 问题
    • 热门问题
    • 最新问题
  • 标签
  • 帮助

Footer

RError.com

关于我们

  • 关于我们
  • 联系我们

Legal Stuff

  • Privacy Policy

帮助

© 2023 RError.com All Rights Reserve   沪ICP备12040472号-5