【问题标题】:Output file much larger than input files after cat + grepcat + grep 后输出文件比输入文件大得多
【发布时间】:2019-02-20 16:26:33
【问题描述】:

我有 18 个 csv 文件,大小都在 1mb 到 14mb 之间。所有文件的总和为 64mb。我想创建一个新的 csv 文件,其中包含这些文件的子集——只有具有模式“Hello”(或“HELLO”或“hello”......)的行。这就是我正在做的事情

   cat *.csv | head -n 1 > new.csv   # I want to create a header first
   cat *.csv | grep -i "hello" >> new.csv

我在WSL 上运行 Debian。输出文件比原来的 64mb 大得多(我在 1+ 小时后停止了这个过程,文件是 300+ GB)。

文本文件的子集如何比原始文件大?跟WSL有关系吗?

【问题讨论】:

    标签: grep glob cat


    【解决方案1】:

    这不是操作系统问题。当您将输出重定向到 new.csv 时,shell 首先创建该文件,然后再计算 glob 表达式 *.csv。这意味着*.csv 的扩展也将包括new.csv。这似乎是您面临的递归 grep 问题的根本原因。

    您正在读取所有文件两次,这不是必需的。您可以使用单个awk 命令使您的操作更加简单和高效:

    awk 'NR==1 {print} tolower($0) ~ /hello/ {print}' *.csv > csv.new
    mv csv.new new.csv
    
    • 由于输出文件被命名为csv.new,它不会干扰全局*.csv
    • NR==1 从第一个文件中提取第一行(标题)

    awk 命令可以更简洁地写成:

    awk 'NR==1 || tolower($0) ~ /hello/' *.csv > csv.new
    

    【讨论】:

      【解决方案2】:

      您正在使用*.csv 并将输出重定向到new.csv,它属于*.csv,这会导致grep 结果中的递归。或许你可以试试,

      grep -i hello *.csv --exclude="new.csv"  >> new.csv
      

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 2011-06-08
        • 1970-01-01
        • 1970-01-01
        • 2021-06-12
        • 2023-02-20
        • 2022-11-02
        • 2011-08-30
        • 2018-06-15
        相关资源
        最近更新 更多