[bash] Problème sur un programme en bash
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):
Code:
1 2 3 4 5 6 7 8 9
|
2115050
2165410
2125953
2000000
5200025
1523215
etc....... |
Le programme va lire chaque nombre et va les chercher dans mon fichier A qui se présente comme ceci :
Code:
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 |
Les nombres cherché se trouve dans le troisième champ
Voici le code qui permet de faire cela:
Code:
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
#-------------------------------------------------------------------------------- |
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.
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