Je dois mettre des données dans un fichier qui doit être unique. supposons que dans file1 j'ai les données suivantes.

ABC
XYZ
PQR

Et maintenant je veux ajouter MNO DES ABC alors il ne devrait copier que "MNO" et "DES" car "ABC" est déjà présent. file1 devrait ressembler à

ABC
XYZ
PQR
MNO
DES

(ABC ne devrait être là qu'une seule fois.)

1
Akshay B 26 janv. 2017 à 20:13

4 réponses

Meilleure réponse

Méthode la plus simple : ce sholud ajoute une ligne non correspondante dans f1

diff -c f1 f2|grep ^+|awk -F '+ ' '{print $NF}' >> f1

ou si «+» va faire partie du texte réel:

diff -c f1 f2|grep ^+|awk -F '+ ' '{ for(i=2;i<=NF;i++)print $i}' >> f1

manière de script shell:

J'ai un script de comparaison qui compare le nombre de lignes / la longueur, etc. mais pour votre besoin, je pense que la partie ci-dessous devrait faire le travail ....

entrée:

$ cat f1
ABC
XYZ
PQR
$ cat f2
MNO
DES
ABC

sortie après le script *

$ ./compareCopy f1 f2
-----------------------------------------------------
 comparing f1 f2
-----------------------------------------------------
Lines check - DONE
$ cat f1
ABC
XYZ
PQR
DES
MNO  

#!/bin/sh

if [ $# != "2" ]; then
  echo
  echo "Requires arguments from command prompt"
  echo "Usage: compare <file1> <file2>"
  echo
  exit
fi

proc="compareCopy"
#sort files for line by line compare
cat $1|sort > file1.tmp
cat $2|sort > file2.tmp

echo "-----------------------------------------------------"
echo " comparing $1 $2" |tee ${proc}_compare.result
echo "-----------------------------------------------------"

file1_lines=`wc -l $1|cut -d " " -f1`
file2_lines=`wc -l $2|cut -d " " -f1`

#Check each line
x=1
while [ "${x}" -le "${file1_lines}" ]
do
  f1_line=`sed -n ${x}p file1.tmp`
  f2_line=`sed -n ${x}p file2.tmp`

        if [ "${f1_line}" != "${f2_line}" ]; then
         echo "line number ${x} don't match in both $1 and $2 files" >> ${proc}_compare.result
         echo "$1 line: "${f1_line}"" >> ${proc}_compare.result
         echo "$2 line: "${f2_line}"" >> ${proc}_compare.result
         # so add this line in file 1
         echo $f2_line >> $1
        fi
x=$[${x} +1]
done

rm -f file1.tmp file2.tmp
echo "Lines check - DONE" |tee -a ${proc}_compare.result
1
Ronak Patel 26 janv. 2017 à 18:16

Perl one liner

fichier un:
1
2
3

fichier deux:
1
4
3

Imprimer uniquement la ligne unique
perl -lne 'print if ++$n{ $_ } == 1 ' file_one.txt file_two.txt

Ou

perl -lne 'print unless ++$n{ $_ } ' file_one.txt file_two.txt

sortie
1
4
3
2

0
Shakiba Moshiri 26 janv. 2017 à 17:35

Utilisez fgrep:

fgrep -vf file1 file2 > file2.tmp && cat file2.tmp >> file1 && rm file2.tmp

Qui récupère toutes les lignes de file2 qui ne sont pas dans file1 et ajoute le résultat à file1.

Vous pouvez jeter un œil à cet article: grep -f nombre maximum de modèles?

1
Community 23 mai 2017 à 12:09

La manière naturelle:

sort -u File1 File2 >Temp && mv Temp File1

La solution la plus délicate si les fichiers sont déjà triés:

comm File1 File2 | awk '{$1=$1};1' >Temp && mv Temp File1
0
Udi 29 nov. 2017 à 08:29