Warning: file_get_contents(/data/phpspider/zhask/data//catemap/5/bash/18.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Bash 带变量、字数和zcat的单行命令_Bash_Csv_Unix_Awk_Command Line - Fatal编程技术网

Bash 带变量、字数和zcat的单行命令

Bash 带变量、字数和zcat的单行命令,bash,csv,unix,awk,command-line,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 目标是获得每个文件的行数

我的服务器上有许多文件,其中包含许多行:

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

提前感谢各位。

只需使用
zcat文件| 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

注意2017*gz中文件的
用法
浏览与
2017*gz
模式匹配的文件:这就足够了,无需解析
ls

使用
zgrep-c^文件
计算行数,这里用awk封装:

$ awk 'FNR==1{ "zgrep -c ^ " FILENAME | getline s; print s "|" substr(FILENAME,1,8) }' *.gz
12|20170101
整个
“zgrep-c^”文件名
可能应该在一个var(
s
)中,然后是
s | getline s