使用 sed 编辑文件并将结果保存到名称基于原始文件名的不同文件中

avo*_*les 3 sed files

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

outfile_n000.csv
outfile_n001.csv
outfile_n002.csv
.
.
.
outfile_nXXX.csv
Run Code Online (Sandbox Code Playgroud)

我需要从每个文件中提取一系列行 (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.csvptally_outfile_nXXX.csv文件名之间的交换,但我更喜欢更直接的工作流程。谢谢!

Wil*_*ard 5

使用for循环。

for f in outfile_n???.csv; do
  sed -n '100013,200013p' "$f" > ptally_"$f"
done
Run Code Online (Sandbox Code Playgroud)

或者,根据您的确切实际需求,使用csplit. 一些GNU 扩展大大扩展了它的功能。

  • 或者在循环内简单地`sed -n "100013,200013w ptally_$f" "$f"` (3认同)