一行命令包含变量,字数和zcat

时间:2017-01-04 14:05:39

标签: bash csv unix awk command-line

我在服务器上有很多文件,包含很多行:

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

先谢谢你们。

2 个答案:

答案 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