在linux下解析一个文件

时间:2013-05-30 21:11:54

标签: linux bash parsing

我正在尝试根据推特数据计算一些新闻文章的受欢迎程度。然而,在检索推文时,我忘了逃避以无法使用的文件结尾的角色。

以下是文件中的一行:

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

1 个答案:

答案 0 :(得分:4)

如果我们可以假设时间,ID,转发,用户名和链接字段中没有额外的分隔符,那么您可以从中间部分删除所有$,$,例如:

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

这是做什么的:

  1. 使用$,$作为分隔符
  2. 拆分该行
  3. 取中间部分=字段[4] ..字段[N-1]
  4. 再次加入$,$前4个字段,固定中间部分和最后一个字段(链接)
  5. 这适用于您的示例,但我不知道您可能有哪些其他角落情况。

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

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

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