【问题标题】:One line command with variable, word count and zcat带有变量、字数和 zcat 的一行命令
【发布时间】:2017-05-18 20:35:33
【问题描述】:

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

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

提前谢谢各位。

【问题讨论】:

    标签: bash csv unix awk command-line


    【解决方案1】:

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

    【讨论】:

      【解决方案2】:

      使用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

      【讨论】:

        猜你喜欢
        • 2014-09-30
        • 2017-11-09
        • 2017-08-19
        • 2011-06-20
        • 1970-01-01
        • 2013-08-02
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多