从文件bash排序的日期列表
我试着从一份名单中找出他们所有人都是在特定日期之间出生的。该清单的格式如下:从文件bash排序的日期列表,bash,list,awk,sed,Bash,List,Awk,Sed,我试着从一份名单中找出他们所有人都是在特定日期之间出生的。该清单的格式如下: ./tool.sh --born-since <dateA> --born-until <dateB> -f <file> id | lastName | firstName | gender | birth | joinDate | IP |浏览器 用户使用此表单给出日期: ./tool.sh --born-since <dateA> --born-until <
./tool.sh --born-since <dateA> --born-until <dateB> -f <file>
id | lastName | firstName | gender | birth | joinDate | IP |浏览器
用户使用此表单给出日期:
./tool.sh --born-since <dateA> --born-until <dateB> -f <file>
这是:
但我似乎找不到正确的结果。在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中:
数据:
$ 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
如果日期为上述格式,则无需对其进行解析。以下示例显示了如何使用
getopt
解析选项:
#!/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"
#/bin/bash
用法=“用法:$0--自日期出生--自日期出生-f文件”
temp=$(getopt-o f:--长期出生自:,出生至:-n“$0”--“$@”)
如果[$?-ne 0]];然后
回显“$usage”
出口1
fi
评估集--“$temp”
while:;做
案件“$1”
-f) 档案=$2;第二班;;
--出生日期)bs=2美元;第二班;;
--出生至)bu=2美元;第二班;;
--)转移;打破
*)回显“内部错误”;出口1;;
以撒
完成
如果[[-z$file]];然后
echo“错误:未给出-f选项”
回显“$usage”
出口1
fi
#TODO:其他验证
awk-v-since=“$bs”-v-until=“$bu”-F“|”since下面是一个示例,演示如何使用getopt
解析选项:
#!/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"
#/bin/bash
用法=“用法:$0--自日期出生--自日期出生-f文件”
temp=$(getopt-o f:--长期出生自:,出生至:-n“$0”--“$@”)
如果[$?-ne 0]];然后
回显“$usage”
出口1
fi
评估集--“$temp”
while:;做
案件“$1”
-f) 档案=$2;第二班;;
--出生日期)bs=2美元;第二班;;
--出生至)bu=2美元;第二班;;
--)转移;打破
*)回显“内部错误”;出口1;;
以撒
完成
如果[[-z$file]];然后
echo“错误:未给出-f选项”
回显“$usage”
出口1
fi
#TODO:其他验证
awk-v-since=“$bs”-v-until=“$bu”-F”|”自使用dateutils
dategrep
和datesort
也能理解--输入格式=STRING
(类似strftime的格式规范)
免责声明如果在同一行中有其他日期,则此项不起作用:p使用dateutils
dategrep
和datesort
也能理解--输入格式=STRING
(类似strftime的格式规范)
免责声明如果同一行中有其他日期,则此操作无效:p如果脚本只是从固定位置参数获取配置,则使用选项没有意义;只需使用/tool.sh
。您的日期格式是什么?我的日期格式是1970-10-28,如上所示。如果您的脚本只是从固定位置参数获取配置,则使用这些选项没有意义;只需使用/tool.sh
。您的日期格式是什么?我的日期格式是1970-10-28,如上所示,不建议使用getopt
,而应该使用getopts
(例如,请参见)?getopts只提供简短的选项名称哦,我看到有不同的版本,比如“GNU增强型getopt
”它支持所有的getopts
操作以及长选项。不要紧:)不是不受鼓励的,应该使用getopts
(例如,请参见)?getopts只提供短选项名称哦,我看到有不同的版本-比如“GNU增强型getopt
”,它支持getopts
的所有功能以及长选项。不要紧:)但在程序上添加值之前和之后如何添加?那么script.awk是什么呢?但是你如何在程序上添加之前和之后的值呢?脚本是什么?
$ dategrep ">=1971-01-01&&<=2012-01-01" < foo | datesort
||||1971-01-01|||
||||2012-01-01|||