【发布时间】:2015-12-04 12:51:15
【问题描述】:
我有一个格式如下的文件:
string1,string2,string3,...
...
我必须分析第二列,计算每个字符串的出现次数,并生成一个格式如下的文件:
"number of occurrences of x",x
"number of occurrences of y",y
...
我设法编写了以下脚本,效果很好:
#!/bin/bash
> output
regExp='^\s*([0-9]+) (.+)$'
while IFS= read -r line
do
if [[ "$line" =~ $regExp ]]
then
printf "${BASH_REMATCH[1]},${BASH_REMATCH[2]}\n" >> output
fi
done <<< "`gawk -F , '!/^$/ {print $2}' $1 | sort | uniq -c`"
我的问题是: 有更好更简单的方法来完成这项工作吗?
特别是我不知道如何解决这个问题:
gawk -F , '!/^$/ {print $2}' miocsv.csv | sort | uniq -c | gawk '{print $1","$2}'
问题是 string2 可以包含空格,如果是这样,gawk 上的第二次调用将截断字符串。 我都不知道如何打印“从 2 到 NF”的所有字段,保持分隔符,这可以连续出现多次。
非常感谢, 再见
编辑:
如题,这里有一些示例数据:
(这是一个练习,对发明者感到抱歉)
输入:
*,*,*
test, test ,test
prova, * , prova
test,test,test
prova, prova ,prova
leonardo,da vinci,leonardo
in,o u t ,pr
, spaces ,
, spaces ,
leonardo,da vinci,leonardo
leonardo,da vinci,leonardo
leonardo,da vinci,leonardo
in,o u t ,pr
test, test ,test
, tabs ,
, tabs ,
po,po,po
po,po,po
po,po,po
prova, * , prova
prova, * , prova
*,*,*
*,*,*
*,*,*
, spaces ,
, tabs ,
输出:
3, *
4,*
4,da vinci
2,o u t
3,po
1, prova
3, spaces
3, tabs
1,test
2, test
【问题讨论】: