在多个文件中查找单词并在另一个文件中排序

时间:2018-08-20 16:29:34

标签: bash for-loop printf

需要有关“ printf”和“ for”循环的帮助。

我有单独的文件,每个文件都以用户(e.g. john.txt, david.txt)命名,并包含每个用户运行的各种命令。命令示例为(SUCCESS, TERMINATED, FAIL, etc.)。文件具有多行带有各种文本的行,但是每一行包含一个命令(每行1个命令)。

示例:

  command: sendevent "-F" "SUCCESS" "-J" "xxx-ddddddddddddd"
  command: sendevent "-F" "TERMINATED" "-J" "xxxxxxxxxxx-dddddddddddddd"

我需要遍历每个文件,计算每个命令的数量,并将其以这种格式放入另一个输出文件中:

==== John ====
SUCCESS - 3
TERMINATED - 2
FAIL - 4

TOTAL 9


==== David ====
SUCCESS - 1
TERMINATED - 1
FAIL - 2

TOTAL 4

2 个答案:

答案 0 :(得分:0)

P.S。可以使此代码更紧凑,例如,无需使用那么多的echo等,但是使用了以下结构来清楚说明正在发生的事情:

ls | grep .txt | sed 's/.txt//' > names


for s in $(cat names)
do
suc=$(grep "SUCCESS" "$s.txt" | wc -l)
termi=$(grep "TERMINATED" "$s.txt"|wc -l)
fail=$(grep "FAIL" "$s.txt"|wc -l)
echo "===  $s  ===" >>docs
echo "SUCCESS  -  $suc" >> docs
echo "TERMINATED  -  $termi" >> docs
echo "FAIL  -  $fail" >> docs
echo "TOTAL $(($termi+$fail+$suc))">>docs
done

我的测试文件的输出就像:

===new===
SUCCESS  -  0
TERMINATED  -  0
FAIL  -  0
TOTAL 0
===vv===
SUCCESS  -  0
TERMINATED  -  0
FAIL  -  0
TOTAL 0

基于karafka's的建议,而不是将以上行用于 for循环,您可以直接使用以下内容:

for f in *.txt 
do 
something 
#in order to print the required name in the file without the .txt you can do a
printf "%s\n" ${f::(-4)}

答案 1 :(得分:0)

awk来营救!

$ awk -vOFS=" - " 'function pr() {s=0; 
                                  for(k in a) {s+=a[k]; print k,a[k]}; 
                                  print "\nTOTAL "s"\n\n\n"} 
                 NR!=1 && FNR==1 {pr(); delete a} 
                 FNR==1          {print "==== " FILENAME " ===="} 
                                 {a[$4]++} 
                 END             {pr()}' file1 file2 ...

如果您的输入文件不是结构化的(键并不总是在第四个字段上),则可以使用模式匹配进行同样的操作。