为什么uniq -c输出空格而不是\ t?

时间:2012-07-26 13:29:42

标签: shell awk uniq

我使用uniq -c一些文本文件。 它的输出如下:

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

...

所以我需要提取总数(如上面的123和2),但我无法弄清楚如何,因为如果我按空格分割这一行,它会喜欢这个['123', 'first', 'word(tab)other', 'things']。 我想知道它为什么不用tab输出?

如何提取shell中的总数? (我最终用python,WTF提取它)

更新:抱歉,我没有正确描述我的问题。我不想总和总数,我只想用(制表符)替换(空格),但它不影响单词中的空格,因为我之后仍然需要数据。就像这样:

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

7 个答案:

答案 0 :(得分:6)

试试这个:

uniq -c | sed -r 's/^( *[^ ]+) +/\1\t/'

答案 1 :(得分:6)

尝试:

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'

答案 2 :(得分:1)

您可以使用awk

对所有数字求和
awk '{s+=$1}END{print s}'

答案 3 :(得分:0)

$ cat <file> | uniq -c | awk -F" " '{sum += $1} END {print sum}'

答案 4 :(得分:0)

在计数之后获取标签的一种可能解决方案是编写一个类似于uniq -c的脚本,它可以根据您的需要进行格式化。这是一个快速尝试(似乎通过了我的一分钟左右的测试):

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

答案 5 :(得分:0)

另一种解决方案。这相当于早期的sed解决方案,但它确实使用awk作为请求/标记!

cat yourFile.txt \
    | uniq -c \
    | awk '{
        match($0, /^ *[^ ]* /);
        printf("%s\t%s\n", $1, substr($0, RLENGTH + 1));
      }'

答案 6 :(得分:0)

基于William Pursell answer,如果您喜欢与Perl兼容的正则表达式(PCRE),也许会是一种更为优雅和现代的方式

perl -pe 's/ *(\d+) /$1\t/'

选项为to execute (-e) and print (-p)