Bonjour,
Un collègue de bureau m'avait fait un code en bash qui me permet de supprimer ou commenter une ligne à l'aide d'un "$" dans un fichier A lorsque le nombre dans le fichier B est trouvé dans le fichier A.
Pour être plus précis, j'ai un fichier dans lequel j'ai des nombres les uns en dessous des autres comme ceci (coorespond à mon fichier B):
Le programme va lire chaque nombre et va les chercher dans mon fichier A qui se présente comme ceci :
Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3
4
5
6
7
8
9 2115050 2165410 2125953 2000000 5200025 1523215 etc.......
Les nombres cherché se trouve dans le troisième champ
Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37 FORCE 2500 2115050 0 1.-2448.27 2683.11 5590.67 FORCE 2500 2115061 0 1.-2448.27 2683.11 5590.67 FORCE 2500 2095050 0 1.-2448.27 2683.11 5590.67 FORCE 2500 2095060 0 1.-2448.27 2683.11 5590.67 $ $ $ $$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$ FORCE 2500 2165410 0 5394.09 -.003393.323574 -.946197 FORCE 2500 2165420 0 2686.05 -.003393.323574 -.946197 FORCE 2500 2165430 0 5509.89 -.003393.323574 -.946197 FORCE 2500 2175410 0 5395.21 -.003393.323574 -.946197 FORCE 2500 2175420 0 2687.27 -.003393.323574 -.946197 FORCE 2500 2175430 0 5509.98 -.003393.323574 -.946197 $ FORCE 2600 270800 0 612.051 -.003669.985618 -.16895 FORCE 2600 270801 0 689.983 -.003804.98932 -.145711 FORCE 2600 270804 0 689.596 -.003805.989918 -.141593 FORCE 2600 270830 0 79.359 -.005185.999987 4.7803-5 FORCE 2600 270831 0 158.767 -.005185.999987 1.3383-4 FORCE 2600 270832 0 158.769 -.005154.999987 1.7677-4 FORCE 2600 270930 0 2868.73 0. .490462 -.871463 FORCE 2600 270940 0 4572.04 0. .469962 -.882687 FORCE 2600 270950 0 7981.49 0. .383634 -.923485 FORCE 2600 280010 0 6617.53 -.007605 0. .999971 FORCE 2600 280020 0 9923.29 -.007618-.052568.998588 FORCE 2600 280030 0 13226.3 -.007669-.104955.994447 FORCE 2600 280040 0 13226.4 -.007769-.174333.984656 FORCE 2600 280050 0 13225.8 -.007911-.242862.970029 FORCE 2600 280060 0 13225.5 -.008097-.310206.950635 FORCE 2600 280070 0 13225.4 -.008332-.376028.926571 FORCE 2600 280080 0 13224.6 -.008619-.43998 .897966 FORCE 2600 280090 0 13224. -.008947-.501783.864947 FORCE 2600 280100 0 13581.7 -.009323-.562686.826618 FORCE 2600 280110 0 13572.5 -.009735-.61915 .785213 FORCE 2600 280120 0 13205.3 -.010175-.673957.738701
Voici le code qui permet de faire cela:
Mon soucis est le suivant, lorsqu'un nombre du fichier B existe plus de deux fois dans mon fichier A le fichier de sortie est vide.
Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98 #!/bin/ksh # # #-------------------------------------------------------------------------------- # INPUTS #-------------------------------------------------------------------------------- dat_files="" # Get inputs ls -al echo "-- INPUTS --" echo " This script removes nodes force/moment in dat files" echo "Give DAT files:" read dat_files echo "Give nodes IDs list to remove:" read target_node_ids target_node_ids=`cat $target_node_ids` # Check inputs valididy TMP_VAR="" for file in $dat_files do if [ -f $file ] ; then TMP_VAR="$TMP_VAR $file" else echo "" echo " File $file doesn't exist." fi done dat_files=$TMP_VAR if [ "$dat_files" = "" ] ; then echo "No DAT input files !" exit fi # Ask for confirmation echo "" echo "Selected DAT files:" for file in $dat_files do echo $file done echo "Selected nodes IDs to remove: $target_node_ids" echo "" echo "Proceed (y)?" read answer if [ "$answer" != "y" ] ;then exit fi # #-------------------------------------------------------------------------------- # PROCESS #-------------------------------------------------------------------------------- # for curr_dat_file in $dat_files do echo "" echo "File "$curr_dat_file # Copy DAT File cp $curr_dat_file $curr_dat_file"_old" # Process each target node target_node_count=0 # FORCE/MOMENT cards need to be in small format! pos_index=9 ((pos_index_end=$pos_index+8)) grep "^FORCE " $curr_dat_file | cut -c$pos_index-$pos_index_end | sed "s/[ ]//g" > tmp_col.tmp for curr_target_node in $target_node_ids do target_node_count=$(($target_node_count+1)) k=`grep $curr_target_node tmp_col.tmp | wc -l` if [ $k -ge 1 ] ; then i=1 while [ $i -le $k ] do raw_to_delete=`grep "^FORCE[0-9 ].*$curr_target_node" $curr_dat_file | head -n $i` ########### # 1=removal # sed "/^$raw_to_delete$/d" $curr_dat_file > tmp ########### # 2=comment sed "s/$raw_to_delete/\$$raw_to_delete/g" $curr_dat_file > tmp ########### mv tmp $curr_dat_file echo " Following card has been commented = <"$raw_to_delete">" i=$(($i+1)) done fi done echo $target_node_count" nodes removed" done rm -f tmp_col.tmp # echo "" echo "Job done!" #-------------------------------------------------------------------------------- # END OF FILE #--------------------------------------------------------------------------------
Je ne suis pas expert je comprend plus ou moins le code mais là je suis bloqué.
quelqu'un pour m'aider m'aiguiller ?
Ps : Je n'ai plus contact avec ce collègue sinon je me serai adressé à lui directement
Merci d'avance
Partager