Como copiar linhas no comando awk? (o script ksh é preferido)

0

Eu tenho o arquivo de índice abaixo

 key1|1|1001
 key1|1|2001
 key2|2|3001
 key2|2|4001
 using this index file, I have to update my main file
 key1|1000|2000|3000|4000
 key2|1000|2000|3000|4000

 The expected output should be
 key1|1001|2000|3000|4000
 key1|2001|2000|3000|4000
 key2|1000|3001|3000|4000
 key2|1000|4001|3000|4000

Mas meu script.awk abaixo não está duplicando as chaves no arquivo principal, em vez disso, ele sobrescreve o valor no respectivo índice. O que há de errado com o roteiro? awk -f script.awk index.txt main.txt

    #!/bin/awk
BEGIN {
    FS = "|"
}
( NR == FNR ) {
    lookup[toupper($1)] = $0
}

( NR > FNR ) {
    key = toupper($1)
    split(lookup[key], replacements, "|")
    for (i = 1; i <= NF; i++)
        col[i] = $i;
    for (i=1; i <= NF; i=i+1){
    j=replacements[i]
    col[j] = replacements[i+1]
    }
    for (i = 1; i <= NF; i++)
        printf "%s|", col[i]
}
    
por janani 24.10.2014 / 06:55

1 resposta

1

Você estava perto, apenas desnecessariamente complicou essa tarefa. Tente awk -f script.awk main.txt index.txt (observe a ordem inversa dos arquivos) com o seguinte script:

#!/bin/awk

BEGIN {
    FS = "|"
}
( NR == FNR ) {
    lookup[toupper($1)] = $0
}

( NR > FNR ) {
    key = toupper($1)
    n=split(lookup[key], replacements, "|")
    replacements[$2+1]=$3
    for (i=1; i<n+1; i++)
        printf "%s|", replacements[i]
    printf "\n"
}

O resultado é

 key1|1001|2000|3000|4000|
 key1|2001|2000|3000|4000|
 key2|1000|3001|3000|4000|
 key2|1000|4001|3000|4000|

Não tenho certeza se você deseja manter os pipes | no final das linhas, mas é trivial removê-los de qualquer forma.

O principal problema com a sua abordagem foi que a matriz lookup foi substituída toda vez que a nova linha teve o mesmo key da anterior. Assim, é preciso inverter a ordem dos arquivos - primeiro leia este que tem o primeiro campo exclusivo para usá-lo como um índice de matriz.

E BTW, isso é puro awk solution, nada a ver com ksh ou qualquer outro shell.

    
por 24.10.2014 / 08:51