2015-06-09 2 views
1

Я пытаюсь разделить файл на более мелкие файлы с помощью gawk и переименовать файлы меньшего размера по порядку из исходного файла.Использование Gawk и Printf в сценарии Bash

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

Выход дает мне: new_file_1.txt new_file_2.txt ЭСТ ...

Я хотел бы выход быть: new_file_0001.txt new_file_0002.txt ЭСТ ...

+0

Непонятно, для чего нужен внешний цикл - похоже, вы собираетесь переписать свои файлы ... –

ответ

1

Игнорирование вопроса о внешнем контуре и сосредоточившись на AWK части вопроса, то вы можете использовать sprintf для создания вашего файла:

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

Спецификатор формата %04d означает, что число представляет собой цифру, дополненную длиной 4 с ведущими нулями.

Если вы хотите просмотреть все .txt-файлы и продолжать увеличивать счетчик, то вы можете избавиться от цикла и передать все их на awk сразу, изменив "$i" на *.txt.

1

Вы можете делать:

for i in *.txt; do 
    printf -v num "%04d" $((++n)) 
    gawk -v num="$num" -v RS="START_of_LINE_to_SEPARATE" 'NF{ 
     print RS$0 > "new_file_" num ".txt"}' "$i" 
done 
Смежные вопросы