bash sort / uniq -c:如何在输出中使用tab而不是space作为分隔符?

时间:2016-07-12 19:13:21

标签: bash sorting delimiter

我有一个文件strings.txt列出字符串,我正在处理这样的字符:

sort strings.txt | uniq -c | sort -n > uniq.counts

因此,生成的文件uniq.counts将列出按其计数按升序排序的uniq字符串,如下所示:

 1 some string with    spaces
 5 some-other,string
25 most;frequent:string

请注意strings.txt中的字符串可能包含空格,逗号,分号和其他分隔符,但选项卡除外。如何让uniq.counts采用这种格式:

 1<tab>some string with    spaces
 5<tab>some-other,string
25<tab>most;frequent:string

3 个答案:

答案 0 :(得分:1)

使用GNU sed:

sort strings.txt | uniq -c | sort -n | sed -r 's/([0-9]) /\1\t/' > uniq.counts

输出到uniq.counts:

 1      some string with    spaces
 5      some-other,string
25      most;frequent:string

如果你想编辑你的文件&#34;就地&#34;使用sed的选项-i

答案 1 :(得分:1)

您可以在写入sed之前简单地将排序等输出传送到uniq.counts,例如添加:

| sed -e 's/^\([0-9][0-9]*\)\(.*$\)/\1\t\2/' > uniq.counts

完整的表达方式是:

$ sort strings.txt | uniq -c | sort -n | \
sed -e 's/^\([0-9][0-9]*\)\(.*$\)/\1\t\2/' > uniq.counts

(为了清楚起见,包括续行)

答案 2 :(得分:1)

你可以这样做:

sort strings.txt | uniq -c | sort -n | sed -E 's/^ *//; s/ /\t/' > uniq.counts

sed将首先删除行开头的所有前导空格(在计数之前),然后在计数到tab字符后将其替换为空格。