Incrementar padrão numérico no arquivo

6

Eu tenho um arquivo que contém apenas a seguinte linha:

BOF
(REF-REQ0001 SW_requirement)
EOF

Eu preciso gerar um segundo arquivo que contenha o seguinte:

BOF
(REF-REQ0001 SW_requirement)
(REF-REQ0002 SW_requirement)
(REF-REQ0003 SW_requirement)
EOF

Ou seja, a primeira linha deve ser duplicada e para cada uma delas a parte numérica de "REQ0001" deve ser incrementada com 1.

    
por Coronel 18.12.2014 / 13:44

4 respostas

3

perl seria bom para isso:

perl -ne 'for $n (1..4096) {s/\d+/ sprintf "%04d", $n /e; print}' File > File2
    
por 18.12.2014 / 15:01
1

Não tenho certeza se BOF e EOF são partes do arquivo, mas, de qualquer forma, você pode tentar o seguinte código awk :

awk 'BEGIN{FS="REQ| "}/[[:digit:]]/{for(i=0;i<4096;i++){printf($1"REQ%04d "$3"\n",$2+i)};next}1'
    
por 18.12.2014 / 14:34
1

Isso imprime a linha inteira substituindo um novo valor para o campo 2 e deve funcionar independentemente de quantos campos podem aparecer mais tarde na linha.

awk -F 'REQ| ' '$1 == "(REF-" {field1 = $1; $1 = ""; num = $2; for (i = 0; i < 4096; i++) {$2 = sprintf("%sREQ%04d", field1, num + i); line = $0; sub("^ ", "", line); print line}; next} {print}' inputfile

Separado em várias linhas:

awk -F 'REQ| ' '$1 == "(REF-" {
        field1 = $1; 
        $1 = ""; 
        num = $2; 
        for (i = 0; i < 4096; i++) {
            $2 = sprintf("%sREQ%04d", field1, num + i); 
            line = $0; 
            sub("^ ", "", line); 
            print line
        };
        next
    }
    {
        print
    }' inputfile
    
por 18.12.2014 / 18:29
1

O seguinte apenas usa nl principalmente, embora tr gere um monte de linhas em branco e sed prepends o REQ bit ...

IFS=\  read -r l r <file
tr \0 \n </dev/zero| 
nl -ba -w4 -nrz -s" $r"|
sed "s/^/${l%Q*}Q/;4096q"

Primeiro, ele salva as duas metades em $l e $r com read . Então tr anula 4096 nulos em \n ewlines - que nl conta e acrescenta $r e a última sed apenas adiciona $l a cada uma de suas primeiras 4096 linhas de entrada antes de q entrada completamente.

Ou muito mais simplesmente com seq :

IFS=\  read -r l r <file
seq -ws " $r
${l%Q*}Q" 0 4097 | 
sed '1d;$d'
    
por 18.12.2014 / 19:40

Tags