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」で1行を出力する必要があります)

于 2013-05-30T21:47:40.807 に答える