搜索不同文件夹中的.txt文件以查找特定字符串

时间:2016-07-18 17:29:03

标签: bash

这里是bash脚本新手。 我有一个文件夹(/月),其中包含更多文件夹(/ month / jan,/ month / feb,/ month / mar等),在这些文件夹中有.txt文件(Sales11.txt,Sales17.txt等) 。这些文本文件包含员工ID号及其销售结果百分比 例如Sales11.txt的内容是

20456 78
20512 46
20498 67
20645 88

我希望在这些.txt文件中搜索一个员工ID号,当存在时,在名字Jan.txt或者哪个月的工作人员文件夹/ staff / 20512(已经存在)中创建一个文本文件它已经发生了.Jan.txt文件的内容将是销售文件的名称和百分比。每个月可能会有多个销售活动。

示例输出文件将是/ staff / 20512名为Jan.txt的文件,其中包含

Sales11 46
Sales17 98

我认为我需要包含一个if循环并使用数组来搜索不同的文件夹,并在此使用grep函数来搜索staff id。

我不是百分之百应该包含哪些顺序以及如何在单个脚本中使用多个不同的数组,如果可能的话。我的第一次尝试是在下面。

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 个答案:

答案 0 :(得分:0)

由于数据中没有员工ID未能显示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。