【问题标题】:Bash : Huge file size processing issue in vim modeBash:vim 模式下的巨大文件大小处理问题
【发布时间】:2016-08-12 04:26:03
【问题描述】:

我有一个大约500MB 的巨大文件大小,每一行都会包含如下所述的数据。

#vim results.txt
{"count": 8, "time_first": 1450801456, "record": "A", "domain": "api.ai.", "ip": "54.240.166.223", "time_last": 1458561052}
{"count": 9, "time_first": 1450801456, "record": "A", "domain": "cnn.com.", "ip": "54.240.166.223", "time_last": 1458561052}
 .........

总共 2500 万行。

现在,我想将results.txt 文件保留为,

8,1450801456,A,api.ai,54.240.166.223,1458561052
9,1450801456,A,cnn.com,54.240.166.223,1458561052
....

通过删除不需要的字符串,如 count 、 time_first 、 record 、domain 、 ip 、 time_last 。

现在,在 vim 模式下,我正在删除每个字符串。例如,我会做%s/{"count": //g

对于一个字符串,替换它需要更多时间。

我是 Bash/shell 的初学者,如何使用 sed / awk 做到这一点?请问有什么建议吗?

【问题讨论】:

  • 有成千上万的 awk 和 sed 示例,通过进行前期 google 搜索很容易找到。它们不是一些不起眼的库
  • 我没有对您投反对票,但您在尝试找到解决方案方面并没有付出太多努力。如果您已经尝试过,请展示您尝试过的内容以及发生的情况。
  • 是的。我没有投反对票,但快速的谷歌搜索会为您提供答案,所以我认为缺乏努力是导致投反对票的原因。
  • @JavierBuzzi 是的,已经在做那个伙伴了。如果我遇到任何问题,将更新帖子。
  • 停止尝试为此使用 vim,您需要 sed、awk 或 cut。

标签: bash unix vim awk sed


【解决方案1】:

使用 sed:

sed -E 's/[{ ]*"[^"]*": *|["}]//g' file
#    ^    ^    ^         ^^---- remaining double quotes and the closing bracket
#    |    |    |         '----- OR
#    |    |    '--------------- key enclosed between double quotes
#    |    '-------------------- leading opening curly bracket and spaces
#    '------------------------- use ERE (Extended Regular Expression) syntax

其他方式:使用包含 json 解析器的 xidel

xidel -q file -e '$json/*' | sed 'N;N;N;N;N;y/\n/,/'
#     ^           ^     ^         ^         ^---- translate newlines to commas
#     |           |     |         '-------------- append the next five lines
#     |           |     '------------------------ all values
#     |           '------------------------------ for each json string
#     '------------------------------------------ quiet mode

距离@BeniBela 更短,不需要sed 将字段连接在一起:

xidel -q file -e '$json/join(*,",")'

【讨论】:

  • xidel 对我来说一些新的东西并学习。感谢分享。
  • @Arun:请注意,xidel 不是 unix/linux 通用工具,必须安装。我添加了一个方法,因为这个实用程序非常有用(对于 JSON、XML、HTML)、强大和宽容。
  • 将把它安装在我的 linux 机器上,并尝试在我的大部分作品中使用它。谢谢
  • 这里不需要 sed。 Xidel 将文件作为对象序列读取,然后您可以映射每个对象:xidel -q file -e '$json/join(*, ",")'。虽然它将所有数据都保存在内存中,但对于这么大的文件,这可能是个坏主意
  • @BeniBela:谢谢,我一直在寻找类似的东西,但没有找到。
【解决方案2】:

需要考虑的事项:

$ awk -F'[{}":, ]+' -v OFS=, '{for (i=3;i<NF;i+=2) printf "%s%s", $i, (i<(NF-1)?OFS:ORS)}' file
8,1450801456,A,api.ai.,54.240.166.223,1458561052
9,1450801456,A,cnn.com.,54.240.166.223,1458561052

获取 Arnold Robbins 的《Effective Awk Programming, 4th Edition》一书。

【讨论】:

  • Ed:非常感谢您对此的回答。最后尝试使用 sed : sed -i 's/{"count": //g;s/ "time_first": //g;s/ "rrtype": //g;s/ "rrname": //g; s/ "rdata": //g;s/ "time_last": //g;s/}//g' test.txt
  • 感谢参考,有时间我会看的。
  • @Arun 不需要对所有这些文本字符串进行硬编码,使用任何工具的正确方法是只使用它们在每一行上的相对位置或定义一个正则表达式来删除你想要的内容(或不想)。
猜你喜欢
  • 2021-12-20
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2010-12-14
  • 1970-01-01
  • 2021-10-06
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多