Como obter os valores de duas colunas em um arquivo txt e combiná-los com valores em outro

0

Eu tenho dois arquivos de texto formatados da seguinte forma:

por exemplo. Arquivo1:

   900        480   10060.62       2740 -266864.19 3843493.50    2740.00       2740     176.07
   900        479   10046.50       2741 -266874.34 3843486.00    2741.00       2741     176.07
   900        478   10032.38       2742 -266884.47 3843478.50    2742.00       2742     176.07
   900        477   10018.26       2743 -266894.62 3843471.00    2743.00       2743     176.07

por exemplo. Arquivo2:

   -2.68785700E+05  3.84401270E+06         313.33   2740.00    313.33 2740 1.401298E-044 2 LY1-0900
   -2.68783800E+05  3.84400040E+06         313.35   2741.00    313.35 2741 1.401298E-044 2 LY1-0900
   -2.68781900E+05  3.84398810E+06         313.36   2742.00    313.36 2742 1.401298E-044 2 LY1-0900
   -2.68780000E+05  3.84397580E+06         313.38   2743.00    313.38 2743 1.401298E-044 2 LY1-0900

Eu preciso substituir as duas primeiras colunas no arquivo 2 pelas colunas 5 e 6 no Arquivo 1, com base nas correspondências com os valores da primeira e da sétima colunas do arquivo 1 e da 9ª e 4ª colunas no arquivo 2.

Isso soa muito confuso para me deixar dar um exemplo do que o script faria ...

Pegue a primeira linha do arquivo 2, encontre a linha no arquivo 1 onde o primeiro valor da coluna (900) corresponde aos 4 últimos dígitos da 9ª coluna (0900) E o 7º (2740.00) corresponde ao 4º (2740.00) então substitua as colunas 1 e 2 no arquivo2 pela quinta e sexta colunas do arquivo 1.

ou seja,

   -2.68785700E+05  3.84401270E+06         313.33   2740.00    313.33 2740 1.401298E-044 2 LY1-0900

torna-se

   -266864.19           3843493.50         313.33   2740.00    313.33 2740 1.401298E-044 2 LY1-0900

ENTÃO, vá para a próxima linha, etc. finalmente, exibindo um novo arquivo.

A saída desejada ficaria assim:

   -266864.19     3843493.50         313.33   2740.00    313.33 2740 1.401298E-044 2 LY1-0900
   -266874.34     3843486.00         313.35   2741.00    313.35 2741 1.401298E-044 2 LY1-0900
   -266884.47     3843478.50         313.36   2742.00    313.36 2742 1.401298E-044 2 LY1-0900
   -266894.62     3843471.00         313.38   2743.00    313.38 2743 1.401298E-044 2 LY1-0900

Estou basicamente tentando procurar novas coordenadas espaciais de uma superfície bidimensional.

Os valores podem não estar sempre em ordem e os arquivos podem ser relativamente grandes (6 milhões de linhas), portanto, seria útil se o script fosse eficiente.

    
por jaffa1201 13.04.2016 / 11:54

2 respostas

0

Você pode usar o seguinte script como exemplo:

#!/bin/sh
outfile="outfile"
echo "testfile1:"
cat testfile1
echo "testfile2:"
cat testfile2
cat /dev/null > $outfile
cat testfile1 | while read line; do
    matchfirst="'echo $line | awk '{print $3}''"
    matchsecond="'echo $line | awk '{print $4}''"
    finded="false"
    while read defline; do
        tplfirst="'echo $defline | awk '{print $3}''"
        tplsecond="'echo $defline | awk '{print $4}''"
        if [ "$tplfirst" = "$matchfirst" ] && [ "$tplsecond" = "$matchsecond" ]; then
            echo -n "'echo $defline | awk '{print $1}'' 'echo $defline | awk '{print $2}'' 'echo $line | awk '{print $3}'' 'echo $line | awk '{print $4}''"  >> $outfile
            echo >> $outfile
            finded="true"
        fi
    done < testfile2 
    if [ "$finded" = "false" ]; then
        echo $line >> $outfile
    fi
done

echo "outfile:"
cat outfile

Exemplo de uso:

➜ sild@$work 15:29:55 [test]$ ./replacer.sh 
testfile1:
1 2 3 4
5 6 7 8
9 10 11 12
testfile2:
11 21 3 4
51 61 7 8
9 10 111 121
outfile:
11 21 3 4
51 61 7 8
9 10 11 12

É o seu objetivo?

    
por 13.04.2016 / 14:31
0

Tente isto:

awk 'FNR==NR{
    a[$1"@"$7]=$5" "$6;
    next
}
{
    i=length($NF);
    n=substr( $NF, i-2, i);
    if( n"@"$4 in a) {
        split(a[n"@"$4],b," ")
    };
    $1=b[1];
    $2=b[2]
}
1' file1 file2
    
por 13.04.2016 / 15:18