我使用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
答案 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/'