2017-10-18 20 views
0

J'essaye d'employer le script de bash pour faire cette chose mais je ne peux pas faire cela.Comment utiliser le script bash pour obtenir seulement des lignes dans le FICHIER B qui sont différentes d'un autre FICHIER A?

Voici mes données.

fichier A:

43477 102531 114783 4,115 -1,748 11,127 5,587
41777 50955 84639 -4,310 -0,091 10,786 -3,910
41777 44259 65661 -2,176 -0,615 4,667 -2,365
43477 102531 114783 4,115 - 1,748 11,127 5,587

fichier B:

43477 102531 114783 4,115 -1,748 11,127 5,587
45777 117537 87933 -0,796 -1,043 5,087 -1,581
48977 88665 56952 -2,188 -0,919 4,310 -2,523
41777 50955 84639 -4,310 -0,091 10,786 -3,910
49577 69957 97128 -1,940 -1,209 4,153 -1,680
41777 44259 65661 -2,176 -0,615 4,667 -2,365
47977 98640 88665 -1,894 -0,800 4,032 -2,315
41777 44259 65661 -2,176 -0,615 4,667 -2,365

Je veux obtenir quelque chose comme,

FINAL:

45777 117537 87933 -0,796 -1,043 5,087 -1,581
48977 88665 56952 -2,188 -0,919 4,310 -2,523
49577 69957 97128 -1,940 -1,209 4,153 -1,680
47977 98640 88665 -1,894 -0,800 4.032 -2.315

Imprimez uniquement les lignes du FICHIER B qui sont différentes du FICHIER A, et s'il y a des lignes en double, imprimez-en une seule en utilisant le script bash.

Merci

+0

Je vous recommande de rechercher cela, il existe d'innombrables exemples de "différence d'impression entre deux fichiers" et "imprimer première occurrence de chaque ligne". –

+1

Je pense que l'exemple est incorrect: par exemple la première ligne du fichier A et B est la même mais ne fait pas partie de la sortie même si vous demandez "... s'il y a des lignes dupliquées, imprimez-en une seule. " Quoi qu'il en soit, vous pouvez vérifier [cette réponse] (https://unix.stackexchange.com/questions/11343/linux-tools-to-treat-files-as-sets-and-perform-set-operations-on -them) et vous trouverez ce que vous cherchez. – bubbakk

Répondre

0

Voici ce que vous voulez:

#!/bin/bash 

declare -A hash_a hash_b 
IFS="\n" 

while read line; do 
    hash_a[$line]=1 
done < File_A 

while read line; do 
    hash_b[$line]=1 
done < File_B 

for i in ${!hash_b[@]}; do 
    if [ -z "${hash_a[$i]}" ]; then 
     echo $i 
    fi 
done 

L'astuce est qu'un tableau associatif unifie automatiquement les lignes identiques en utilisant toute la ligne comme une clé.

+0

Merci beaucoup @tshiono –