2012-08-10 4 views
2

J'ai deux dossiers A1 et A2. Les noms et le nombre de fichiers sont identiques dans ces deux dossiers. Chaque fichier a 15 colonnes. La colonne 6 de chaque fichier dans le dossier «A1» doit se fondre dans la colonne 6 de chaque fichier du dossier «A2». Je voudrais imprimer les colonnes 2 et 6 (après soustraction) de chaque fichier à un dossier A3 avec les mêmes noms de fichiers. Comment puis-je faire ça avec awk?soustraire des colonnes de différents fichiers avec awk

f1.txt file in folder A1 

RAM  AA 159.03 113.3 122.9 34.78 116.3 
RAM  BB 151.24 70 122.9 142.78 66.4 
RAM  CC 156.70 80 86.2 70.1  54.8 


    f1.txt file in folder A2  

RAM  AA 110.05 113 122.9 34.78 116.3 
RAM  BB 150.15 70  122.9 140.60 69.4 
RAM  CC 154.70 89.2 86.2  72.1  55.8 


desired output 

AA 0 
BB 2.18 
CC -2 
+0

Pourriez-vous les gars s'il vous plaît répondre à cette question alors: http://stackoverflow.com/questions/ 15049478/subtructing-n-nombre-de-colonnes-de-deux-fichiers-avec-awk –

Répondre

3

Une façon utilisant awk:

awk 'FNR==NR { array[$1]=$2; next } { if ($1 in array) print $1, array[$1] - $2 > "A3/f1.txt" }' ~/A1/f1.txt ~/A2/f1.txt 

FIRST EDIT:

En supposant un nombre égal de fichiers dans les deux répertoires (A1 et A2) avec des noms appariés de la façon que vous décrivez :

for i in A1/*; do awk -v FILE=A3/${i/A1\//} 'FNR==NR { array[$1]=$2; next } { if ($1 in array) print $1, array[$1] - $2 > FILE }' A1/${i/A1\//} A2/${i/A1\//}; done 

Vous devrez d'abord créer le répertoire A3, sinon vous obtiendrez une erreur.

DEUXIÈME EDIT:

awk 'FNR==NR { array[$2]=$6; next } { if ($2 in array) print $2, array[$2] - $6 > "A3/f1.txt" }' ~/A1/f1.txt ~/A2/f1.txt 

EDIT TROISIÈME:

for i in A1/*; do awk -v FILE=A3/${i/A1\//} 'FNR==NR { array[$2]=$6; next } { if ($2 in array) print $2, array[$2] - $6 > FILE }' A1/${i/A1\//} A2/${i/A1\//}; done 
+0

Merci pour votre réponse. Mon fichier a 15 colonnes. Je voudrais imprimer column2 et column6 après avoir soustrait les valeurs de column6. J'ai changé $ 2, $ 6 au lieu de $ 1, $ 2 dans votre code. Les résultats de la soustraction ne sont pas corrects. Comment puis-je changer votre code pour obtenir les bonnes valeurs? – user1588971

+0

@ user1588971: J'ai de la difficulté à interpréter votre demande. Pensez à mettre à jour votre question avec un exemple de vos fichiers de 15 colonnes ainsi qu'un exemple de la sortie que vous attendez. J'ai apporté une modification à ce que je pense que vous demandez, mais j'ai peut-être complètement mal interprété la question. – Steve

+0

Merci pour votre commentaire. J'ai édité ma question. – user1588971

12

Essayez ceci:

paste {A1,A2}/f1.txt | awk '{print $2,$6-$13}' 

En bash: {A1,A2}/f1.txt va étendre à A1/f1.txt A2/f1.txt (Il est juste un raccourci jamais l'esprit..)
J'utilise commande paste pour fusionner des fichiers verticalement. La commande awk est assez simple ici.

+0

Est-ce que 'join' est un shell c commande (pour bash)? '{}' spécifie le jeu de fichiers d'entrée, le '/' le fichier de sortie? – Levon

+0

Oui, je l'ai testé dans 'bash' (Ubuntu 12.04). – kev

+0

Merci - fournir quelques explications de base avec les solutions rend des réponses meilleures et plus utiles à mon avis. – Levon

Questions connexes