8

uniq -c テキストファイルを使用します。その出力は次のようになります。

123(space)first word(tab)other things
  2(space)second word(tab)other things

....

したがって、合計数(上記の123と2など)を抽出する必要がありますが、この行をスペースで分割すると、このようになるため、方法がわかりません['123', 'first', 'word(tab)other', 'things']。なぜタブで出力しないのか知りたいです。

そして、シェルで合計数を抽出する方法は? (最終的にpython、WTFで抽出します)

更新:申し訳ありませんが、質問を正しく説明していませんでした。合計数を合計したくありませんでした。(スペース) を (タブ) に置き換えたいだけですが、後でデータが必要なため、単語のスペースには影響しません。ちょうどこのような:

123(tab)first word(tab)other things
  2(tab)second word(tab)other things
4

7 に答える 7

8

試す:

uniq -c text.file | sed -e 's/ *//' -e 's/ /\t/'

これにより、行数の前のスペースが削除され、最初のスペースのみがタブに置き換えられます。

すべてのスペースをタブに置き換えるには、tr を使用します。

uniq -c text.file | tr ' ' '\t'

タブのすべての連続実行を単一のタブに置き換えるには、-s を使用します。

uniq -c text.file | tr -s ' ' '\t'
于 2012-07-26T13:56:22.320 に答える
8

これを試して:

uniq -c | sed -r 's/^( *[^ ]+) +/\1\t/'
于 2012-07-26T13:49:37.977 に答える
1

を使用してすべての数値を合計できますawk

awk '{s+=$1}END{print s}'
于 2012-07-26T13:37:56.753 に答える
0

カウント後にタブを取得するための1つの可能な解決策は、uniq -c希望どおりにフォーマットするようなスクリプトを作成することです。これが簡単な試みです(私の1分ほどのテストに合格したようです):

awk '
(NR == 1) || ($0 != lastLine) {
    if (NR != 1) {
        printf("%d\t%s\n", count, lastLine);
    }
    lastLine = $0;
    count = 1;
    next;
}
{
    count++;
}
END {
    printf("%d\t%s\n", count, lastLine);
}
' yourFile.txt
于 2012-07-26T14:03:45.687 に答える
0

別の解決策。sedこれは以前のソリューションと同等ですがawk、要求/タグ付けされたとおりに使用されます!

cat yourFile.txt \
    | uniq -c \
    | awk '{
        match($0, /^ *[^ ]* /);
        printf("%s\t%s\n", $1, substr($0, RLENGTH + 1));
      }'
于 2012-07-26T14:49:12.573 に答える
0
$ cat <file> | uniq -c | awk -F" " '{sum += $1} END {print sum}'
于 2012-07-26T13:38:14.420 に答える