2017-01-08 1 views
1

У меня есть требование, когда мне нужно разбить файл на шаблон подчёркивания, а строки в результирующем файле должны имеют максимум 5 строк, если результат превышает 5 строк, имя файла должно быть изменено, а остальные строки должны быть помещены в другие разделенные файлы, а затем результат должен быть сгруппирован.Разделить файл на основе определенного шаблона поиска, а также указать определенное количество строк в файле split с помощью команды AWK

Для например:

Мой файл содержит,

ADD1_5001AB 
ADD1_5002AB 
ADD1_5003BC 
ADD1_5004AB 
ADD1_5005AB 
ADD1_5006BC 
ADD1_5007AB 
ADD1_5008AB 
ADD1_5009BC 
ADD1_5010AB 
ADD1_5011AB 
ADD1_5012BC 
ADD2_5100XY 
ADD2_5101YZ 
CANC1_5200AB 
CANC1_5201BC 
CANC2_5301GH 
CANC2_5302FG 

Так что мой результат должен иметь 6 файлов,

первый файл должен содержать

ADD1_5001AB 
ADD1_5002AB 
ADD1_5003BC 
ADD1_5004AB 
ADD1_5005AB 

второй файл должен содержать

ADD1_5006BC 
ADD1_5007AB 
ADD1_5008AB 
ADD1_5009BC 
ADD1_5010AB 

третий файл должен содержать

ADD1_5011AB 
ADD1_5012BC 

четвёртую файл должен содержать

ADD2_5100XY 
ADD2_5101YZ 

пятый файл должен содержать,

CANC1_5200AB 
CANC1_5201BC 

шестой файл должен содержать

CANC2_5301GH 
CANC2_5302FG 

Просьба помочь.

+0

Префикс ваших линий с четырьмя пробелами. Пожалуйста, взгляните на [edit-help] (http://stackoverflow.com/editing-help). – Cyrus

+0

Теперь, что вы пробовали? – Jdamian

+0

Я пробовал awk -F "_" '{print $ 0> $ 1}'. Но не удалось разделить на основе номера строки –

ответ

1

Вы можете использовать

awk -F _ 'prefix != $1 || line == 5 { line = 0; ++slab; out = sprintf("out%02d.txt", slab); prefix = $1 } { ++line; print > out }' input.txt 

Где input.txt является входной файл. Это работает следующим образом: _ используется в качестве разделителя полей, поэтому $1 является префиксом до первого _. Тогда:

# prefix contains the last seen first field. When it changes or when the last 
# slab grew to five lines long, we need to start a new output file. So 
prefix != $1 || line == 5 { 
    line = 0       # reset line counter 
    ++slab        # increase slab number 
    out = sprintf("out%02d.txt", slab) # use that number to generate a new output 
             # file name 
    prefix = $1       # and remember the new prefix 
} 

# then, for all lines: 
{ 
    ++line        # increase line counter 
    print > out       # and print the line to the current output 
             # file. 
} 

Как дано, это будет генерировать файлы out01.txt, out02.txt и так далее. Измените строку формата в вызове sprintf, чтобы настроить его.

+0

Большое спасибо, он работает так, как я хотел. Теплые пожелания. –