我正在尝试根据 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
它的作用:
- 使用
$,$
作为分隔符分割行 - 取中间部分 = fields[4] .. fields[N-1]
- 通过
$,$
再次连接前 4 个字段、固定的中间部分和最后一个字段(链接)
这适用于您的示例,但我不知道您可能还有哪些其他极端情况。
验证结果的一个好方法是计算所有行中 $,$
出现的次数为 6。您可以通过将结果传送到此来做到这一点:
... | perl -ne 'print scalar split(/\$,\$/), "\n"' | sort -u
(应输出一行,带有“6”)
关于linux - linux下解析文件,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/16845944/