2

我正在尝试根据 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 但我没有得到我想要的结果。解决这个问题的好策略是什么?

4

1 回答 1

4

如果我们可以假设时间、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”)

于 2013-05-30T21:47:40.807 回答