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