使用sed编辑文件并将结果保存到不同的文件中,文件名以原始文件名为基础

使用sed编辑文件并将结果保存到不同的文件中,文件名以原始文件名为基础

我有一大堆(~300).csv 文件,每个文件都有~200k 行长,具有常规文件名模式:

outfile_n000.csv
outfile_n001.csv
outfile_n002.csv
.
.
.
outfile_nXXX.csv

我需要从每个文件中提取一系列行 (100013-200013),并将提取的区域保存到新的 .csv 文件中,附加前缀ptally_以将其与原始文件区分开来,同时保留原始文件。

我知道我可以使用

sed -n '100013,200013p' outfile_nXXX.csv > ptally_outfile_nXXX.csv

对单个文件执行此操作,但我需要一种方法来自动处理大批量文件。我可以通过使用-ised 中的选项来实现这一点:

sed -iptally_* -n '100013,200013p' outfile_nXXX.csv > ptally_outfile_nXXX.csv

但这会将提取的行写入outfile_nXXX.csv,并将原始文件重命名为ptally_outfile_nXXX.csv,因为这是 的目的-i

同样,bash 中的大括号扩展也不起作用,因为大括号扩展和通配符不能混合使用:

sed --n 10013,20013p *.csv > {,ptally_}*.csv

有什么优雅的方法可以将提取和重命名结合到更简单的过程中吗?目前,我正在使用 bash 脚本来执行outfile_nXXX.csv和文件名之间的交换ptally_outfile_nXXX.csv,但我更喜欢更简单的工作流程。谢谢!

答案1

使用for循环。

for f in outfile_n???.csv; do
  sed -n '100013,200013p' "$f" > ptally_"$f"
done

或者,根据您的具体实际要求,使用它可能更适用csplit。一些GNU 扩展大大扩展其威力。

答案2

不是sed,但相当优雅的方式:

awk 'NR >= 100013 && NR <= 200013 {print > "ptally_" FILENAME}' outfile_nXXX.csv

要批量提取到新的、适当的文件,请执行以下操作:

awk 'FNR >= 100013 && FNR <= 200013 {print > "ptally_" FILENAME}' outfile_n*

另外,您可以在将文件名传递给之前将其存储到变量中sed

filename="outfile_nXXX.csv"

sed -n '100013,200013p' "$filename" > "ptally_$filename"

相关内容