2016-07-18 3 views
0

Новое в bash скриптах здесь. У меня есть папка (месяц), которая содержит больше папок (/ month/jan,/month/feb,/month/mar и т. Д.), И в этих папках есть .txt-файлы (Sales11.txt, Sales17.txt и т. Д.).). Эти текстовые файлы содержат штат ID номера и их результаты продаж в процентном например Sales11.txt содержаниеПоиск в файлах .txt в разных папках для определенной строки

20456 78 
20512 46 
20498 67 
20645 88 

Ищу искать через эти файлы .txt для персонала идентификационного номера и когда это существует, чтобы сделать текстовый файл в папке/персонале сотрудников/20512 (которые уже существуют) по имени Jan.txt или в зависимости от того, в каком месяце он произошел. Содержимое файла Jan.txt будет именем файла продаж и процентом , В каждом месяце может быть более одного события продаж.

Пример выходного файла будет/сотрудников/20512 файл с именем Jan.txt, которые содержат бы

Sales11 46 
Sales17 98 

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

Я не 100%, в каком порядке они должны быть включены и как использовать несколько разных массивов в одном скрипте, если это возможно. Моя первая попытка ниже.

while read STAFFID ; do 

    ARRSTAFF=($STAFFID) 
    ARRMON=($MONTHS) 
    ARRSALE=($SALES) 

    if [ grep -r “/month/${ARRMON}/${ARRSALE}.txt” -e “${ARRSTAFF}” ]; then 

    echo “${ARRSALE[0]} ${ARRSALE[1]}” >> Staff/${ARRSTAFF[0]}/${ARRMON}.txt 

    fi 

done < contents/Staff.txt 
+1

Пожалуйста, взгляните на [edit-help] (http://stackoverflow.com/editing-help). – Cyrus

+0

Можете ли вы использовать find, потому что тогда вы можете сделать что-то вроде 'find. -name * .txt -exec echo {} \; -exec grep -o "$ ID" {} \; ' – redxef

+0

Есть ли идентификаторы персонала среди данных, которые не отображаются в Staff.txt? –

ответ

0

Поскольку в данных, которые не отображаются в Staff.txt, персональных идентификаторов нет, последний не предоставляет дополнительной информации. Его можно игнорировать. Каждая строка каждого ежедневного файла отчета будет соответствовать одной строке в одном из сгенерированных файлов для каждого сотрудника. Таким образом, проще читать каждый ежедневный файл только один раз и обрабатывать все его содержимое в этом прогоне.

Кроме того, неясно, есть ли какие-либо особые преимущества для создания массивов в памяти. Это делает скрипт более сложным, и это теряет, если вы не получите что-то существенное взамен.

Вот один способ, которым Вы могли бы подойти к решению проблемы:

# keep one level of backups of existing target files 
for file in /staff/*.txt; do 
    mv "${file}" "${file}.bak" 
done 

# Process the data files once each 
for file in /month/*/*.txt; do 
    # extract relevant filename parts 
    month=$(basename $(dirname "${file}")) 
    filebase=$(basename "${file%.txt}") 

    # read and report out all the lines of the file 
    while read staffid value; do 
    echo "$filebase" "$value" >> "/staff/${staffid}/${month}.txt" 
    done < "$file" 
done 

Это предполагает, в первую очередь, что ежедневные файлы отчетов отформатированы как вы описываете, без каких-либо дополнительных полей и никаких пробелов в полях. Он вообще не полагается на Staff.txt.

+0

Большое спасибо за помощь, я дам, что попробуйте позже, когда я вернусь на свой компьютер. Это выглядит очень многообещающе. – Jon

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