从文件bash排序的日期列表

时间:2016-10-06 18:22:11

标签: bash list awk sed

我试图从所有人的名单中找到他们在某些日期之间出生的人。该列表具有以下形式:

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

但我似乎找不到合适的结果。

3 个答案:

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

dategrepdatesort也了解--input-format=STRING(类似strftime的格式规范)

免责声明如果您在同一行中有其他日期,则此功能不起作用:P