【发布时间】:2015-05-26 00:31:09
【问题描述】:
这个网站还是新手,但这里有...... 基本上我将事件存储在多个文件中,每个事件都是一行,每一行包含日期($1)、开始($2)和停止($3)时间以及其他几条数据。我使用两个双下划线(“__”)作为字段分隔符。我一直在使用各种 shell 脚本来管理数据,并且我正在使用 awk 来计算统计数据,但我在调用 date 函数时遇到了麻烦,因此我可以按星期几获得总数。经过大量修补和扫描讨论板后,我得到了这个:
ls /home/specified/folder/MBRS.db/* |
xargs -n 1 -I % awk -F"__" '$6 == "CLOSED" && $1 >= "'$backDATE'" { print $0 }' % |
awk 'BEGIN{FS="__"}{specDATE=system("date --date="$1" +%a")} specDATE == "Tue" {print $2" "$3}'
或
ls /home/lingotech/Einstein/data/MBRS.db/* |
xargs -n 1 -I % awk -F"__" '$6 == "CLOSED" && $1 >= "'$backDATE'" { print $0 }' % |
awk 'BEGIN{FS="__"}system("date --date="$1" +%a") == "Mon" {print $2" "$3}'`
我没有输出开始和停止时间,而是为每个条目获取一周中所有不同日期的列表。
我尝试了比我愿意承认的更多的日期用法变体,包括:
for y in Sun Mon Tue Wed Thu Fri Sat; do
for directory in $( ls /home/specified/directory/MBRS.db/* | xargs -n 1 ); do
printf "."
[[ $( cat $directory | awk -F"__" '$6 == "CLOSED" && $1 >= "'$backDATE'" { print $1 }' | xargs -n 1 -I z date +%a -d z ) == "$y" ]] && echo BLAH
done
done
非常感谢对我搞砸的事情进行一些有用的解释。提前致谢。哦,我以 YYMMDD 格式存储日期,但这对于 ubuntu 服务器的“日期”版本似乎不是问题。
【问题讨论】:
-
我认为您需要像这样转义
{specDATE=system("date --date="$1" +%a")}中的嵌套双引号:{specDATE=system("date --date=\"$1\" +%a")}。至少,我会对那段语法持怀疑态度,因为当 shell 看到$1时,它在引号之外。我认为您应该使用除awk之外的可以更直接地管理日期的语言进行编码。awk很棒——不要误会我的意思。但是每行数据运行一次date对性能不利。我会使用 Perl(但我已经使用 Perl 二十年了);对你来说使用 Python 可能更明智。 -
我认为
xargs命令中的-n 1和-I %(以及后续的%)只是减慢处理速度的方法;awk愉快地处理多个文件。在两个awk脚本中将字段分隔符设置为__的不对称方式很奇怪。第二个脚本应该与第一个脚本结合使用,因此您只运行一个awk脚本。允许将awk脚本放在多行上。将每个pattern { action }单元放在自己的线上通常是明智的,除非所有东西都可以舒适地放在一条线上。如果{action}本身需要多行,请使用它们。 -
我最初是从一个 awk prog 开始的,但由于遇到问题,我使用管道和 xargs 尝试分离出我正在做的事情以查看错误。例如,当我使用以下内容时,我可以打印出星期几,但是我无法将其用于任何类型的条件检查(即这是星期二): ls /home/absolute/path/* | xargs -n 1 -I % awk -F"" '$6 == "CLOSED" && $1 >= "'$backDATE'" { print $0 }' % | awk 'BEGIN{FS=""} $4 == "SJ" {system("date -d"$1" +%a")}'
-
awk -F "__" -v newDAY="date -d "$1" +%a" '$6 == "CLOSED" && $1 >= "'150000'" {print newDAY}' /home/lingotech/Einstein/data/MBRS.db/* ....类似这样的东西例如会将 newDAY 作为字符串传递 "date -d "$1" +%a" 但我希望它运行日期命令并存储其值
-
实际上,如果您使用的是 Ubuntu,
gawk有strftime可以简化事情。当前的mawk(相对于Ubuntu中的版本)也支持strftime。