我有一大堆(~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
对单个文件执行此操作,但我需要一种方法来自动处理大批量文件。我可以通过使用-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
,但我更喜欢更简单的工作流程。谢谢!
答案1
答案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"