2017-10-09 3 views
1

fichier d'abord, file_utm:BASH, fusionner deux fichiers, matrice triangulaire inférieure et supérieure, en un seul fichier

1.3 3.5 2.8 
    2.1 1.4 
     0.5 

fichier Deuxièmement, file_ltm:

1.3 
3.5 2.1 
2.8 1.4 0.5 

Et une condition, quand if i=j; then i=j=0; fi

Fichier de sortie:

0 1.3 3.5 2.8 
1.3 0 2.1 1.4 
3.5 2.1 0 0.5 
2.8 1.4 0.5 0 

C'est ce que j'ai essayé:

#!/bin/bash 
for ((x=1; x<=3; x++)) 
do 
    awk -v var=$x 'NR==var' file_utm > ROW 
    awk -v var=$x 'NR==var' file_ltm > COLUMN 
    for ((y=1; y<=3; y++)) 
    do 
     R=`awk -F "\t" -v var=$y '{print $var}' ROW` 
     C=`awk -F "\t" -v var=$y '{print $var}' COLUMN` 
     echo $R >> file 
     echo $C >> file 
     rm ROW 
     rm COLUMN 
    done 
done 

L'autre option que j'ai bien est de remplir un fichier avec une matrice que des espaces, séparés par des onglets, et remplir cette matrice par une valeur donnée et aborder la positions de ligne et de colonne. Je sais comment le faire en C++, mais pas en bash et en utilisant i.e. awk.

Répondre

2

solution Awk:

awk 'NR==FNR{ a[NR+1]=$0 FS 0; next }{ sub(/^ +/,""); print (FNR==1)? 0:a[FNR],$0 } 
    END{ print a[FNR+1] }' file_ltm file_utm 

La sortie:

0 1.3 3.5 2.8 
1.3 0 2.1 1.4 
3.5 2.1 0 0.5 
2.8 1.4 0.5 0 
+0

Merci. Mais, quand je l'ai essayé avec deux gros fichiers, ça ne marche pas. Les fichiers ASCII peuvent être atteints à: we.tl/TSBTSqacrj –

+0

@ Another.Chemist, je travaille pour votre entrée actuelle de la question. J'ai observé les lignes dans vos fichiers - ils ont un nombre de colonnes incohérent/arbitraire et ne font pas partie d'une grande matrice – RomanPerekhrest

+0

Ok, c'est vrai, merci, +1 pour votre réponse –

1

La lecture des deux fichiers en utilisant le descripteur de fichier 5 et 6

# opening files descriptor for reading 
exec 5< file_utm || exit 1 
exec 6< file_ltm || exit 1 

read -u5 up 
echo "0 $up" 
while read -u5 up; read -u6 low; [[ $low ]]; do 
    echo "$low 0 $up" 
done 

# closing files 
exec 5>&- 
exec 6>&-