我的文件夹中有 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
awk
and 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
。请分享您的反馈。