需要有关“ 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
答案 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 ...
如果您的输入文件不是结构化的(键并不总是在第四个字段上),则可以使用模式匹配进行同样的操作。