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
并将输出重定向到属于 *.csv
的 new.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
我有 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
并将输出重定向到属于 *.csv
的 new.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