как перенаправить содержимое одного файла в другой? - PullRequest
0 голосов
/ 10 июля 2020

У меня есть этот файл test.in

    $cat test.in
    Topic: Topic1   Partition: 0    Leader: 1   Replicas: 1 Isr: 1  Offline: 
    Topic: Topic1   Partition: 1    Leader: 1   Replicas: 1 Isr: 1  Offline: 
    Topic: Topic1   Partition: 2    Leader: 2   Replicas: 2 Isr: 2  Offline: 
    Topic: Topic1   Partition: 3    Leader: 3   Replicas: 3 Isr: 3  Offline: 
    Topic: Topic1   Partition: 4    Leader: 3   Replicas: 3 Isr: 3  Offline: 
    Topic: Topic1   Partition: 5    Leader: 2   Replicas: 2 Isr: 2  Offline: 

Я хочу разделить этот файл столько раз, сколько лидеров. Среди параметров файла есть определение Topi c, Partition, Leader и т.д. c. В нашем примере есть 3 лидера (их может быть больше)

Со значениями Topi c и Partition я хочу создать новый контент.

Для этого я использую:

while read line
> do
> awk '{print "bean kafka.log:type=Log,name=LogStartOffset,topic="$2",partition="$4}' 
> done <test

И я получаю:

bean kafka.log:type=Log,name=LogStartOffset,topic=Topic1,partition=1
bean kafka.log:type=Log,name=LogStartOffset,topic=Topic1,partition=2
bean kafka.log:type=Log,name=LogStartOffset,topic=Topic1,partition=3
bean kafka.log:type=Log,name=LogStartOffset,topic=Topic1,partition=4
bean kafka.log:type=Log,name=LogStartOffset,topic=Topic1,partition=5
bean kafka.log:type=Log,name=LogStartOffset,topic=Topic1,partition=6
bean kafka.log:type=Log,name=LogStartOffset,topic=Topic1,partition=7
bean kafka.log:type=Log,name=LogStartOffset,topic=Topic1,partition=8
bean kafka.log:type=Log,name=LogStartOffset,topic=Topic1,partition=9

Но я хочу разделить выходной файл на другой в зависимости от определения лидера в test.in.

Я хочу, чтобы результат был примерно таким:

$cat Broker1
bean kafka.log:type=Log,name=LogStartOffset,topic=Topic1,partition=0
bean kafka.log:type=Log,name=LogStartOffset,topic=Topic1,partition=1

$cat Broker2
bean kafka.log:type=Log,name=LogStartOffset,topic=Topic1,partition=2
bean kafka.log:type=Log,name=LogStartOffset,topic=Topic1,partition=5

$cat Broker3
bean kafka.log:type=Log,name=LogStartOffset,topic=Topic1,partition=3
bean kafka.log:type=Log,name=LogStartOffset,topic=Topic1,partition=4

Я пытаюсь сделать это, изменяя while-l oop таким образом:

while read line
> do
> BROKER=$(awk '{print $6}')
> awk '{print "bean kafka.log:type=Log,name=LogStartOffset,topic="$2",partition="$4}' >>broker."$BROKER"
> done <test.in

Но я получил эту ошибку:

-bash: broker.$BROKER: ambiguous redirect

И Не понимаю, что не так.

Спасибо

Ответы [ 2 ]

1 голос
/ 10 июля 2020

Отметьте этот, он работает без использования каких-либо других внешних команд (другой способ):

awk '
{ 
    array[$6]=array[$6]";"$0
    
}
END{
    for(i in array){
        num++
    }

    for(x=1; x <= num ; x++){           
        num_a=split(array[x], array_a, ";")
    
        for(y=2; y <= num_a; y++){
            split(array_a[y],array_b)
            output="Broker"array_b[6]
            
            print "bean kafka.log:type=Log,name=LogStartOffset,topic="array_b[2]",partition="array_b[4] > output
        }
        close(output)
    }
}' input_file

Этот скрипт awk совместим с GNU и POSIX.

Результат:

head Broker*
==> Broker1 <==
bean kafka.log:type=Log,name=LogStartOffset,topic=Topic1,partition=0
bean kafka.log:type=Log,name=LogStartOffset,topic=Topic1,partition=1

==> Broker2 <==
bean kafka.log:type=Log,name=LogStartOffset,topic=Topic1,partition=2
bean kafka.log:type=Log,name=LogStartOffset,topic=Topic1,partition=5

==> Broker3 <==
bean kafka.log:type=Log,name=LogStartOffset,topic=Topic1,partition=3
bean kafka.log:type=Log,name=LogStartOffset,topic=Topic1,partition=4
0 голосов
/ 11 июля 2020

Надежный, портативный и эффективный способ сделать это - сначала отсортировать ввод по выноске, чтобы вы могли закрыть выходные файлы, создаваемые при изменении значения выноски:

$ cat -n file |
sort -k7,7 -k1,1n |
awk '
    $7 != prev { close(out); out="Broker"$7; prev=$7 }
    { print "bean kafka.log:type=Log,name=LogStartOffset,topic="$3",partition="$5 > out }
'

.

$ head -20 Broker*
==> Broker1 <==
bean kafka.log:type=Log,name=LogStartOffset,topic=Topic1,partition=0
bean kafka.log:type=Log,name=LogStartOffset,topic=Topic1,partition=1

==> Broker2 <==
bean kafka.log:type=Log,name=LogStartOffset,topic=Topic1,partition=2
bean kafka.log:type=Log,name=LogStartOffset,topic=Topic1,partition=5

==> Broker3 <==
bean kafka.log:type=Log,name=LogStartOffset,topic=Topic1,partition=3
bean kafka.log:type=Log,name=LogStartOffset,topic=Topic1,partition=4

cat - это добавление номеров строк, чтобы после sort относительный порядок строк для каждого значения выноски был таким же, как и раньше. Если вы используете сортировку GNU, то -s (для «стабильной сортировки») делает то же самое.

...