linux - linux下解析文件

标签 linux bash parsing

我正在尝试根据 Twitter 数据计算一些新闻文章的受欢迎程度。然而,在检索推文时,我忘记转义最终导致文件无法使用的字符。

这是文件中的一行:

1369283975$,$337427565662830592$,$0$,$username$,$Average U.S. 401(k) balance tops $80$,$000$,$ up 75 pct since 2009 http://t.co/etHHMUFpoo #news$,$http://www.reuters.com/article/2013/05/23/funds-fidelity-401k-idUSL2N0E31ZC20130523?feedType=RSS&feedName=marketsNews

“$,$”模式不仅作为字段分隔符出现,而且还出现在推文中,我想从其中删除它。 正确的一行是:

1369283975$,$337427565662830592$,$0$,$username$,$Average U.S. 401(k) balance tops $80000 up 75 pct since 2009 http://t.co/etHHMUFpoo #news$,$http://www.reuters.com/article/2013/05/23/funds-fidelity-401k-idUSL2N0E31ZC20130523?feedType=RSS&feedName=marketsNews

我尝试使用 cut 和 sed 但没有得到我想要的结果。解决这个问题的好策略是什么?

最佳答案

如果我们可以假设时间、id、转发、用户名和链接字段中永远不会有额外的分隔符,那么您可以取出中间部分并从中删除所有 $,$,例如这样:

perl -ne 'chomp; @a=split(/\$,\$/); $_ = join("", @a[4..($#a-1)]); print join("\$,\$", @a[0..3], $_, $a[$#a]), "\n"' < data.txt

它的作用:

  1. 使用 $,$ 作为分隔符分割行
  2. 取中间部分 = fields[4] .. fields[N-1]
  3. 通过 $,$ 再次连接前 4 个字段、固定的中间部分和最后一个字段(链接)

这适用于您的示例,但我不知道您可能还有哪些其他极端情况。

验证结果的一个好方法是计算所有行中 $,$ 出现的次数为 6。您可以通过将结果传送到此来做到这一点:

... | perl -ne 'print scalar split(/\$,\$/), "\n"' | sort -u

(应输出一行,带有“6”)

关于linux - linux下解析文件,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/16845944/

相关文章:

c# - Linux Ubuntu 单声道

regex - Bash - Sed/Awk 用新行替换字符串

linux - Unix,替换错误错误?

python - 解析csv文件并根据相对大小将行写入文件

java - 如何替换 Java 中的“字符?”

linux - Linux下两个串口之间的通信

c - 无法在 R 版本 3.4.1 中安装 data.table

linux - 如果 shell 脚本中发生错误,通过电子邮件通知

javascript - 有没有办法使用 Datejs 解析字符串中的日期?

c - 为什么即使回调参数与 XML 中的参数不匹配,GObject 方法仍会被调用?