web-dev-qa-db-fra.com

Awk pour la boucle pour chaque ligne dans un fichier

J'ai besoin de comprendre comment obtenir une boucle via un fichier texte et pour chaque ligne Prenez les champs de nom, de projet et de courrier électronique, et remplacez-les dans un modèle de messagerie à envoyer.

Donc, c'est le fichier texte appelé send.txt:

Project 1,Jack,Chen,06,12,[email protected]
Project 2,Emily,Weiss,06,12,[email protected]
Project 3,Mary,Gonzalas,06,12,[email protected]

et c'est le modèle de messagerie appelé Reminder.Email:

Dear __FULLNAME__: 

This is a kindly reminder that our __Project__ meeting will be held on today. 

Best Regards, 
CIS5027

Donc, pour chaque ligne du fichier texte, je dois remplacer dans ce modèle de courrier électronique dans les champs de [~ # ~] [~ # ~ ~ ~]: et projet. Avec les valeurs correspondantes que je peux faire pour la première ligne, mais je ne peux pas le faire pour chaque ligne.

Ceci est mon script

#

!/bin/sh
#Start your code from here

date= date "+%m/%d/%y"
print $date

#The following line is to scan a file called Event-member.data and return any lines with todays date and save them to a file called sendtoday.txt

grep -n $(date +"%m,%d") Event-member.data > sendtoday.txt

#The following line is to remove the first to characters of the file created above sendtoday.txt and output that to a file called send.txt.

cat sendtoday.txt | sed 's/^..//' > send.txt


#This is where im having trouble. When storing the values for the variables below of name, email, project #. The value of NR==1 thus it never goes through the rest of the lines. I've tried different solutions but none seem to work.

p=$(awk -F ',' 'NR==1{print $1}' send.txt)
n=$(awk -F ',' 'NR==1{print $2}' send.txt)
l=$(awk -F ',' 'NR==1{print $3}' send.txt)
e=$(awk -F ',' 'NR==1{print $6}' send.txt)

echo $p  $n  $l  $e

#This part is to replace the values in the email template using sed and save the modified template as sendnow.txt.  

sed -e "s/__FULLNAME__:/\ $n $l :/g;s/__Project__/\ $p /g" Reminder.email > sendnow.txt

cat sendnow.txt


#Yet to be written ... send out modified email templates.
exit 0

########

C'est la sortie qu'elle produit:

06/12/14
Project 1 Jack Chen [email protected]
Dear  Jack Chen : 

This is a kindly reminder that our  Project 1  meeting will be held on today. 

Best Regards, 
CIS5027

Comme vous le voyez, cela a correctement remplacé les champs mais uniquement pour Jack Chen. Il y avait 3 lignes dans le fichier Send.txt, il doit donc y avoir 3 versions modifiées du modèle ci-dessus.

6
S0urc3

Vous avez utilisé NR == 1 condition NR==1{print $1}. Cela signifie qu'il considérera la première ligne de send.txt. Utilisez NR == 2 Condition pour obtenir 2nd ligne, etc. =OR Utilisez une boucle pour passer par toutes les lignes telles que,

while read line
do
  p=`echo $line | awk -F '.' '{print $1}'`
  n=`echo $line | awk -F '.' '{print $2}'`
  l=`echo $line | awk -F '.' '{print $3}'`
  e=`echo $line | awk -F '.' '{print $1}'`

  sed -e "s/\__FULLNAME\__:/\ $n $l :/g;s/\__Project__/\ $p /g" Reminder.email > sendnow.txt

done<send.txt
3
Tingrammer

peut-être envelopper votre script dans quelque chose comme

for i in $(cat send.txt); do echo "line: $i"; done

?

1
Andreas John