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

标签 regex bash csv awk gawk

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

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  

最佳答案

awk 中的一行代码:

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

它将每个第 2 列字符串的计数存储在关联数组 x 中,最后循环遍历数组并打印结果。

要获得您为该示例显示的准确输出,您需要将其通过管道传输到 sort(1),将字段分隔符设置为 , 并将排序键设置为第二个字段:

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

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

关于regex - 在 bash 中解析类似 .csv 的文件,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/32464523/

相关文章:

iphone - 解析问题

PHP preg_match_all 不返回任何内容

javascript - 使用 JavaScript 正则表达式查找所有 `*.html` 但不包括 `*.tmp.html`

java - 当Runtime.getRuntime().exec调用li​​nux批处理文件时找不到它的物理目录

bash - 如何管理 jq 将 bool 值返回给 bash 以供将来继续

Python读取unicode文件夹和文件名

javascript - 正则表达式 : numbers and few special characters

javascript - 获取 URL 参数函数,获取 url 部分的值,或者如果存在但没有值则返回 true?

windows - 在Windows 上用Bash on Ubuntu 可以练习Linux 吗?

java - 如何检查特定数据是否存在于 CSV 文件中或不存在于 java 中?