我试图从所有人的名单中找到他们在某些日期之间出生的人。该列表具有以下形式:
ID | lastName的|的firstName |性别|生日| joinDate | IP |浏览器
并且用户使用此表单提供日期:
./tool.sh --born-since <dateA> --born-until <dateB> -f <file>
我已经尝试过这个:
bs=$2
bu=$4
sed -e '/-bs/,/bu/g' persons.dat
exit 1
以及:
sed -e '/^#/d' persons.dat | awk -F "|" '!( $5 in a ) {a[$5]; print $0}' | sort
exit 1
但我似乎找不到合适的结果。
答案 0 :(得分:1)
在awk中:
数据:
$ cat foo
id|lastName|firstName|gender|birthday|joinDate|IP|browser
||||2012-01-01|||
||||1970-01-01|||
该计划:
$ cat script.awk
NR==1 || $5 < until && $5 > since # print the first record and when dates fit
运行它:
$ awk -F\| -v since="2011-01-01" -v until="2014-01-01" -f script.awk foo
id|lastName|firstName|gender|birthday|joinDate|IP|browser
||||2012-01-01|||
如果日期采用上述格式,则无需解析它们。
答案 1 :(得分:1)
以下是展示如何使用#!/bin/bash
usage="usage: $0 --born-since DATE --born-until DATE -f FILE"
temp=$(getopt -o f: --long born-since:,born-until: -n "$0" -- "$@")
if [[ $? -ne 0 ]]; then
echo "$usage"
exit 1
fi
eval set -- "$temp"
while :; do
case "$1" in
-f) file=$2 ; shift 2;;
--born-since) bs=$2; shift 2;;
--born-until) bu=$2; shift 2;;
--) shift; break;;
*) echo "internal error"; exit 1;;
esac
done
if [[ -z $file ]]; then
echo "error: no -f option given"
echo "$usage"
exit 1
fi
# TODO: other validations
awk -v since="$bs" -v until="$bu" -F "|" 'since <= $5 && $5 <= until' "$file"
解析选项的示例:
{{1}}
答案 2 :(得分:0)
使用dateutils http://www.fresse.org/dateutils/
$ cat foo
||||2012-01-01|||
||||2013-01-01|||
||||1971-01-01|||
||||1970-01-01|||
$ dategrep ">=1971-01-01&&<=2012-01-01" < foo
||||2012-01-01|||
||||1971-01-01|||
而且datesort
:
$ dategrep ">=1971-01-01&&<=2012-01-01" < foo | datesort
||||1971-01-01|||
||||2012-01-01|||
dategrep
和datesort
也了解--input-format=STRING
(类似strftime的格式规范)
免责声明如果您在同一行中有其他日期,则此功能不起作用:P