如何将相似类型的 .csv 文件合并为一个并计算行数(无需创建新文件)

如何将相似类型的 .csv 文件合并为一个并计算行数(无需创建新文件)

我的文件夹中有 6 个 .csv 文件,分别为 aca1.csv、aca2.csv、aca3.csv、team1.csv、team2.csv 和 team3.csv。每个文件有 80,90,60,70,80 和 90 行..我需要一个 bash 脚本文件,它将结合或合并文件及其类型,例如.. aca1,aca2,aca3 将是 aca 类型。并计算行值(不创建新的合并文件,因为我只想计算行数)。将文件的计数值和类型写入另一个 .csv 文件中。如果有人知道帮助我吗?

答案1

尝试使用下面的 bash 脚本,该脚本适用于名为<pattern><number>.<extension>abc1.csv、abc02.csv、abc123.csv 的文件。您可以选择提供输入目录(默认值:.)作为第一个命令行参数,并提供文件扩展名(默认值:csv)作为第二个参数;当然,如果你想指定$2,就必须强制指定$1。

$ cat ./countlinesbyfilecategory.sh
#!/bin/bash

ptrns=$(for fnm in `find ${1:-.} -regex ".*[0-9][0-9]*\.${2:-csv}"`; do echo $fnm | sed "s/[0-9][0-9]*\.${2:-csv}$//" ; done| sort -u)

for ptrn in $ptrns; do
        echo -n $(basename $ptrn) " "
        find ${1:-.} -regex "${ptrn}[0-9][0-9]*\.${2:-csv}" | xargs wc -l | tail -1 | awk '{print $1}'
done

$

答案2

您可以检查以下使用wc awkand a while的内容loop并迭代不同的模式,因为您只想计算行数:

n=0
while read i
do 
((n=n+$i))
done <<(wc -l aca* | awk '{print $1}')
echo $n;

wc -l aca* | awk '{print $1}'将为您提供模式的每个文件的行数。 while阅读上面的输出,您将得到零值,并递归地添加 最后打印总行数n的输出。wc

为了记录类型和行,您可以编写脚本并将要测量的模式作为输入echo "$pattern $n" >> output.txt

user@server[/apps/home/user/]>  cat script.sh
#!/bin/bash

for p in "aca*" "*sh"
do
n=0;
while read i;
 do ((n=n+$i));
 done < <(wc -l $p | awk '{print $1}'); echo "$p" $n;
done

user@server[/apps/home/user/]> bash script.sh
aca* 46
*sh 432

答案3

目前尚不清楚您是否需要一个或单独的 csv 文件中所有类型的行计数。

如果您需要两个不同的 csv 文件,请使用,

sh-4.3$ for i in aca team
do 
i_ct=`awk -v pat=$i -F ',' 'BEGIN{c=0} FILENAME ~ pat {c += NF}END{print c}' *.csv`
echo "$i,${i_ct}" > ${i}_count.csv 
done 

如果您需要在一个文件中同时输入“test”和“aca”的类型和行数

sh-4.3$ for i in aca team 
do 
i_ct=`awk -v pat=$i -F ',' 'BEGIN{c=0} FILENAME ~ pat {c += NF}END{print c}' *.csv`
echo "$i,${i_ct}" 
done  > All_ftype_count.csv

如果文件类型较多,可以在.txt中的team后面添加for i in。请分享您的反馈。

相关内容