我在服务器上有很多文件,包含很多行:
201701010530.contentState.csv.gz
201701020530.contentState.csv.gz
201701030530.contentState.csv.gz
201701040530.contentState.csv.gz
我想用一行命令得到这个结果:
170033|20170101
169865|20170102
170010|20170103
170715|20170104
目标是获得每个文件的行数,只需保留已存在于文件文件名中的日期。
我尝试了这个,但结果不在一行而是两行......
for f in $(ls -1 2017*gz);do zcat $f | wc -l;echo $f | awk '{print substr($0,1,8)}';done
先谢谢你们。
答案 0 :(得分:2)
只需使用zcat file | wc -l
即可获得行数。
对于名称,我理解提取前8个字符就足够了:
$ t="201701030530.contentState.csv.gz"
$ echo "${t:0:8}"
20170103
所有在一起:
for file in 2017*gz;
do
lines=$(zcat "$file" | wc -l)
printf "%s|%s\n" "$lines" "${file:0:8}"
done > myresult.csv
请注意使用for file in 2017*gz;
来浏览与2017*gz
模式匹配的文件:这样就足够了,无需解析ls
!
答案 1 :(得分:1)
使用zgrep -c ^ file
计算行,这里封装在awk:
$ awk 'FNR==1{ "zgrep -c ^ " FILENAME | getline s; print s "|" substr(FILENAME,1,8) }' *.gz
12|20170101
整个"zgrep -c ^ " FILENAME
可能应该在var(s
)中,然后是s | getline s
。