纯文本数据处理的实用脚本(bash,awk)

计算最大字段长度

典型用途:csv文件导入到数据库时,用于规划字段长度

$ cat file.csv |awk -F "," -v fields_count=10 'BEGIN{for(i=1;i<=fields_count;i++){xcount[i]=0}} {for(i=1;i<=fields_count;i++){if(xcount[i]<length($i) ){xcount[i]=length($i)}}} END{for(i=1;i<=fields_count;i++){print i,xcount[i]}}'

合并将当前目录下所有.csv文件,只保留惟一的首行

典型用途:一系列csv文件,列完全一致,首行是列名;需要将它们合并后做后期处理,通常我们只要保留一个列名行即可。

要求:1) 所有csv文件结尾是空行,否则接合处坏掉;标准的csv文件结尾会有个空行的。 2) 不能有字段内换行符;即字符内换行符需要转义,而不是excel生成的csv文件那样操蛋的转义规则(不转义换行符;用两个并列双引号转义双引号)

head -1 `ls *.csv |grep -v "all.csv" |head -1` >all.csv; total=0;for file in `ls -d *.csv|grep -v 'all.csv'`; do echo -n $file '    '; n=`wc -l $file |awk '{print $1}' `;n=$((n-1));total=$((total+n));echo -n $n 'lines...    ';tail -$n $file >>all.csv;echo ' done'; done; echo 'total lines:    ' $total

实现方法简述:找一个csv文件,将第首行写到all.csv中,然后遍历所有csv文件(除all.csv外),计算行数,将行数减1,将结尾的这么多行追加到all.csv中