在bash中解析类似.csv的文件

Luc*_*uca 5 regex csv bash awk gawk

我有一个格式如下的文件:

string1,string2,string3,...
...
Run Code Online (Sandbox Code Playgroud)

我必须分析第二列,计算每个字符串的出现次数,并生成一个格式如下的文件:

"number of occurrences of x",x
"number of occurrences of y",y        
...
Run Code Online (Sandbox Code Playgroud)

我设法编写以下脚本,工作正常:

#!/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`"
Run Code Online (Sandbox Code Playgroud)

我的问题是:有一种更好,更简单的方法来完成这项工作吗?

特别是我不知道如何解决这个问题:

gawk -F , '!/^$/ {print $2}' miocsv.csv | sort | uniq -c | gawk '{print $1","$2}'
Run Code Online (Sandbox Code Playgroud)

问题是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    ,
Run Code Online (Sandbox Code Playgroud)

输出:

3, * 
4,*
4,da vinci
2,o u   t   
3,po
1,  prova   
3, spaces 
3,  tabs    
1,test
2,  test  
Run Code Online (Sandbox Code Playgroud)

Fil*_*ves 5

awk中的单行:

awk -F, 'x[$2]++ { } END { for (i in x) print x[i] "," i }' input.csv
Run Code Online (Sandbox Code Playgroud)

它存储关联数组中每个第二列字符串的计数 x,最后通过数组循环并打印结果.

要获得您为此示例显示的确切输出,您需要将其传递给sort(1),将字段分隔符设置为,,并将排序键设置为第二个字段:

awk -F, 'x[$2]++ { } END { for (i in x) print x[i] "," i }' input.csv | sort -t, -k2,2
Run Code Online (Sandbox Code Playgroud)

当然,唯一的条件是每行的第二列不包含a ,