我有一组大(~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
对单个文件执行此操作,但我需要一种方法来为大批量文件自动执行此操作。我可以通过使用-i
sed 中的选项来接近:
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
文件名之间的交换,但我更喜欢更直接的工作流程。谢谢!
使用for
循环。
for f in outfile_n???.csv; do
sed -n '100013,200013p' "$f" > ptally_"$f"
done
Run Code Online (Sandbox Code Playgroud)
或者,根据您的确切实际需求,使用csplit
. 一些GNU 扩展大大扩展了它的功能。