substitua valores de string entre dois arquivos

0

Eu quero substituir as freqüências e larguras de banda de formant [1] sozinho do arquivo 1 com as frequências e larguras de banda do arquivo 2 formant [1]. Esta substituição deve ser feita para n frames. Como fazer isso através de um unix roteiro como existem 1000 frames.Por favor me ajude.

arquivo 1:

frames []: 
    frames [1]:
        intensity = 0.006356559616564358 
        nFormants = 5 
        formant []: 
            formant [1]:
                frequency = 403.06628436252515 
                bandwidth = 160.21467462436982 
            formant [2]:
                frequency = 1507.54711702621 
                bandwidth = 519.232413949129 
            formant [3]:
                frequency = 2577.174907989416 
                bandwidth = 1535.5870557191413 
            formant [4]:
                frequency = 3764.624274996511 
                bandwidth = 209.668143917888 
            formant [5]:
                frequency = 4823.479775451361 
                bandwidth = 357.147764183363 
    frames [2]:
        intensity = 0.007108941260004555 
        nFormants = 5 
        formant []: 
            formant [1]:
                frequency = 420.7936179207871 
                bandwidth = 156.6697641580339 
            formant [2]:
                frequency = 1434.5440278308877 
                bandwidth = 377.849704303127 
            formant [3]:
                frequency = 2620.589627797242 
                bandwidth = 1336.5922989596068 
            formant [4]:
                frequency = 3772.337062263397 
                bandwidth = 248.2627364453784 
            formant [5]:
                frequency = 4748.112746186265 
                bandwidth = 244.23733261870277 

arquivo 2:

frames []: 
    frames [1]:
        intensity = 0.306356559616564358 
        nFormants = 5 
        formant []: 
            formant [1]:
                frequency = 203.06628436252515 
                bandwidth = 150.21467462436982 
            formant [2]:
                frequency = 1607.54711702621 
                bandwidth = 629.232413949129 
            formant [3]:
                frequency = 3577.174907989416 
                bandwidth = 3535.5870557191413 
            formant [4]:
                frequency = 4764.624274996511 
                bandwidth = 309.668143917888 
            formant [5]:
                frequency = 5823.479775451361 
                bandwidth = 457.147764183363 
    frames [2]:
        intensity = 0.007108941260004555 
        nFormants = 5 
        formant []: 
            formant [1]:
                frequency = 320.7936179207871 
                bandwidth = 156.6697641580339 
            formant [2]:
                frequency = 1334.5440278308877 
                bandwidth = 377.849704303127 
            formant [3]:
                frequency = 2520.589627797242 
                bandwidth = 1336.5922989596068 
            formant [4]:
                frequency = 4472.337062263397 
                bandwidth = 248.2627364453784 
            formant [5]:
                frequency = 4648.112746186265 
                bandwidth = 244.23733261870277 
    
por santhan 19.11.2015 / 16:32

3 respostas

0

Um onkiner awk (com suas suposições dadas):

awk '{lines[FILENAME,FNR]=$0;last=FNR}END{for(i=1;i<=last;i++){mod=(i-7+19)%19;print(lines[mod>1?"file1":"file2",i])}}' file1 file2

A divisão é:

{
    lines[FILENAME,FNR]=$0;
    last=FNR
}

acima, salva as linhas de cada arquivo. Ele também salva o FNR (número de registro de arquivo) para que ele saiba quantas linhas estão no arquivo.

END {
    for(i=1;i<=last;i++) {
        mod=(i-7+19)%19;
        print(lines[mod>1?"file1":"file2",i])
    }
}

O texto acima é executado em cada linha e imprime a linha do arquivo 1 ou 2, dependendo do valor de mod . mod é computado para cada 19 linhas, iniciando no dia 7, que atinge os dados do formante [1] para cada quadro.

    
por 19.11.2015 / 17:16
0

Aqui está uma abordagem de nível ligeiramente superior. Isso usa scripts de shell em vez de awk scripting. As soluções awk são muito elegantes. Eu forneço isso como um exemplo alternativo.

Suposições: há o mesmo número de formantes e os formantes estão na mesma ordem em cada arquivo. O primeiro formante no arquivo1 substitui o primeiro formante no arquivo2, o segundo formato substitui o segundo formato, etc. Os formantes podem conter um número variável de linhas, e o número de linhas por formante pode ser diferente em cada arquivo.

Esse script usa o comando csplit para dividir cada arquivo em várias partes. As partes ímpares contêm formant[1] s, as partes pares contêm todo o resto.

Após dividir os dois arquivos, remova todas as partes ímpares do arquivo2 e remova todas as partes pares do arquivo1. Então cat os arquivos restantes juntos para produzir a saída final.

Como modificamos o formato do nome do arquivo csplit output, anexando o número do arquivo ao final, ambos os arquivos originais serão divididos no mesmo diretório e utilizamos a correspondência e a ordenação de padrões do shell para remover os arquivos e arquivos apropriados. remontar as peças restantes na ordem correta.

#!/bin/sh

USAGE="
    $0: Usage: $0 file1 file2
    $0 replaces formant[1]'s in file1 with formant[1]'s from file2
    $0 prints the new version of file1 on standard output
"

TMP=tmp$$
mkdir $TMP

for i in 2 1
do
    csplit --quiet --prefix="$TMP/" --suffix-format="%09d-$i" "${1:?$USAGE}" \
         '/formant \[[12]\]/' '{*}'
    shift
done

rm $TMP/*[13579]-2
rm $TMP/*[02468]-1
cat $TMP/*
rm -r $TMP

Isso produz a mesma saída que esta outra resposta

    
por 19.11.2015 / 22:52
0
awk '
    {
        getline a <file2
        if(prn)
            print a
        else
            print
    }
    /formant \[1\]/{
        prn = 1
    }
    /bandwidth/{
        prn = 0
    }
    ' file1

Para diferentes números de formants em file1 e file2 para obter apenas a frequência:

awk '
    BEGIN{
        pattern = "formant \[1\]"
    }
    prn{
        prn = 0
        while($0 !~ pattern)
            getline <file2
        getline <file2
    }
    $0 ~ pattern{
        prn = 1
    }
    1
    ' file1
    
por 19.11.2015 / 18:36