cat + grep后输出文件远大于输入文件

时间:2019-02-20 16:26:34

标签: grep glob cat

我有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有什么关系吗?

2 个答案:

答案 0 :(得分:3)

这不是操作系统问题。当您将输出重定向到var string = "example string is cool and you're great for helping out"; var result = string.replace(/(\S+\s*){1,2}/g, "$&\n"); console.log(result);时,shell将在评估全局表达式new.csv之前首先创建该文件。这意味着*.csv的扩展也将包括*.csv。这似乎是您所面临的递归grep问题的根本原因。

您正在读取所有文件两次,这不是必需的。您可以使用一个new.csv命令来简化操作并提高效率:

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

awk命令可以更简洁地编写为:

NR==1

答案 1 :(得分:2)

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

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