cat + grep 后输出文件比输入文件大很多

Output file much larger than input files after cat + grep

我有 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

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

文本文件的子集怎么会比原始文件大?跟WSL有关系吗?

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

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

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

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

awk 'NR==1 {print} tolower([=10=]) ~ /hello/ {print}' *.csv > csv.new
mv csv.new new.csv
  • 因为输出文件被命名为 csv.new 它不会干扰 glob *.csv
  • NR==1 从第一个文件
  • 中选取第一行 (header)

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

awk 'NR==1 || tolower([=11=]) ~ /hello/' *.csv > csv.new