在 Bash 脚本中使用 Gawk 和 Printf

Using Gawk and Printf in a Bash script

我正在尝试使用 gawk 将文件分成较小的文件,并按原始文件的顺序重命名较小的文件。

for i in *.txt 
do
gawk -v RS="START_of_LINE_to_SEPARATE" 'NF{ print RS[=11=] > "new_file_"++n".txt"}' $i
done

输出给我:new_file_1.txt new_file_2.txt 等...

我希望输出为:new_file_0001.txt new_file_0002.txt 等...

你可以这样做:

for i in *.txt; do 
    printf -v num "%04d" $((++n))
    gawk -v num="$num" -v RS="START_of_LINE_to_SEPARATE" 'NF{
       print RS[=10=] > "new_file_" num ".txt"}' "$i"
done

忽略外循环的问题,关注问题的 awk 部分,您可以使用 sprintf 生成您的文件名:

gawk -v RS="START_of_LINE_to_SEPARATE" 'NF{ file = sprintf("new_file_%04d.txt", ++n) 
                                            print RS[=10=] > file }' "$i"

格式说明符 %04d 表示该数字是一个数字,用前导零填充到长度 4。

如果您想遍历所有 .txt 文件并继续递增计数器,那么您可以通过将 "$i" 更改为 [=14= 来摆脱循环并立即将它们全部传递给 awk ].