2013-10-28 4 views
0

У меня есть текстовый файл (particulars.txt), который содержитдобавьте конкретную строку в определенную строку в конце. -bash

PersonId, PERSONNAME, employmentType

particulars.txt

1,jane,partTime 
2,bob,fullTime 
3,john,fullTime 

Как мне сделать это таким образом, что если ключ я в имя работника, он будет проверять, является ли это лицо занятым полный рабочий день или неполным рабочим днем, и предлагает пользователю ввести зарплату и переписать обратно в файл только для этого человека. Я объясню более подробно.

, например

Enter Name:jane 
jane is a partTime staff 
Enter Hourly Salary:10 

поэтому текстовый файл (particulars.txt) теперь будет

1,jane,partTime,10 
2,bob,fullTime 
3,johnfullTime 

пример два

Enter Name:bob 
bob is a fullTime staff 
Enter monthly Salary:1600 

поэтому текстовый файл (particulars.txt) теперь будет be

1,jane,partTime,10 
2,bob,fullTime,1600 
3,john,fullTime 

это то, что у меня есть мой код

#!/bin/bash 
fileName="particulars.txt" 
read -p "Enter name:" name 
if grep -q $name $fileName; then 
    employmentType=$(grep $name $fileName | cut -d, -f4) 
    echo "$name is $employmentType" staff" 
    if [ $employmentType == "partTime" ]; then 
      echo "Enter hourly pay:" 
      read hourlyPay 
      #calculations for monthly salary(which I have not done) 

    elif [ $employmentType == "fullTime" ]; then 
      echo "Enter monthly salary:" 
      read monthlySalary   
    fi  
else 
    echo "No record found" 
fi 

read -p "Press[Enter Key] to Contiune.." readEnterKey 

Я только смог найти, какой тип занятости делает человек принадлежит, но я не уверен, как/что я должен сделать, чтобы добавить зарплату в конце строки только для этого конкретного человека. я прочитал о sed, но я все еще смущен тем, как использовать sed для достижения моих результатов и, таким образом, обратиться за помощью к вам, ребята. Заранее спасибо

ответ

1

Я просто изменил ваш сценарий.

#!/bin/bash 
fileName="particulars.txt" 
read -p "Enter name:" name 
if grep -q $name $fileName; then 
    employmentType=$(grep $name $fileName | cut -d, -f3) 
    emp_name=$(grep $name $fileName | cut -d, -f2) # Getting emp name 
    emp_id=$(grep $name $fileName | cut -d, -f1) # Getting id 
    echo "$name is $employmentType staff" 
    if [ $employmentType == "partTime" ]; then 
      echo "Enter hourly pay:" 
      read hourlyPay 
      #calculations for monthly salary(which I have not done) 
      sed -i "s/^$emp_id.*$/&,$hourlyPay/g" $fileName # Modifying the file by using id. 

    elif [ $employmentType == "fullTime" ]; then 
      echo "Enter monthly salary:" 
      read monthlySalary 
    fi 
else 
    echo "No record found" 
fi 

read -p "Press[Enter Key] to Contiune.." readEnterKey 

Я добавил следующие строки.

emp_id=$(grep $name $fileName | cut -d, -f1) 
emp_name=$(grep $name $fileName | cut -d, -f2) 
sed -i "s/^$emp_id.*$/&,$hourlyPay/g" $fileName 
+0

спасибо большое за вашу помощь – user2211678

2

Если вы потребность сделать это в интерактивном режиме, вы можете сказать:

sed '/\bbob\b/{s/$/,1600/}' filename 

Это добавило бы ,1600 к линии, соответствующей bob. Обратите внимание, что, указав границы слов \b, вы убедитесь, что изменение сделано только для bob, а не abob или boba.

Вы можете использовать опцию -i, чтобы внести изменения в файл на месте:

sed -i '/\bbob\b/{s/$/,1600/}' filename 

EDIT: Для того, чтобы использовать переменные оболочки, использовать двойные кавычки для команды sed:

sed "/\b$employeeName\b/{s/^$/,$monthlySalary/}" filename 
+0

спасибо за ваш совет. возможно ли, если бы я мог изменить его на что-то вроде ** sed '/ \ $ employeeName {s/$, $ monthSalary}' filename **?таким образом я буду делать это более интерактивным способом, а не просто изменять только для bob – user2211678

+0

@ user2211678 Да, вы были близки, за исключением того, что вам нужно использовать двойные кавычки. См. Править выше. – devnull

+0

спасибо большое за помощь – user2211678

Смежные вопросы