2017-10-09 69 views
0

说我有:awk中:打印特定值范围

> id|lastName|firstName|gender|birthday|creationDate|locationIP|browserUsed 
> 
> 13194139534963|Berty|Jean|male|1988-08-02|2012-04-02T08:33:15.012+0000|41.216.190.153|Google 
> Chrome 
> 
> 13194139535544|Oliveira|Manuel|male|1984-10-31|2012-03-14T16:00:12.287+0000|109.71.166.230|Internet 
> Explorer 
> 
> 13194139537327|Wei|Lei|male|1987-01-06|2012-03-13T03:07:51.899+0000|27.99.188.150|Internet 
> Explorer 
> 
> 13194139539118|Alvarez|Monica|male|1989-10-17|2012-02-25T19:18:54.137+0000|190.169.213.242|Internet 
> Explorer 
> 
> 13194139539746|Xu|Wei|female|1986-11-30|2012-03-19T23:16:12.495+0000|27.103.77.193|Firefox 

我想用这三个参数的命令:./tool.sh --Born,因为dateA --Born,直到dateB -f文件

1)如果诞生,因为和出生的,直到日期给予我想两个特定日期(年 - 月 - 日)之间的打印所有出生(整行) ./tool.sh - 自 - 1988-08-02 - 宝宝 - 直到2012-09-13 -f文件 输出:

13194139534963|Berty|Jean|male|1988-08-02|2012-04-02T08:33:15.012+0000|41.216.190.153|Google 
13194139539118|Alvarez|Monica|male|1989-10-17|2012-02-25T19:18:54.137+0000|190.169.213.242|Internet 
Explorer 

2)如果只是因为生日而给出的,我想列出所有出生日期和之后的人(整行)。 实施例: ./tool.sh --Born-自1988年8月2日-f文件 输出: 同1)

3)如果只有出生-直到日期给出我想列出所有直到那一天出生的人(再次是关于他们的整条线)。 ./tool.sh --Born,直到1988年8月2日-f文件 输出:

13194139535544|Oliveira|Manuel|male|1984-10-31|2012-03-14T16:00:12.287+0000|109.71.166.230|Internet Explorer 
13194139537327|Wei|Lei|male|1987-01-06|2012-03-13T03:07:51.899+0000|27.99.188.150|Internet Explorer 
13194139539746|Xu|Wei|female|1986-11-30|2012-03-19T23:16:12.495+0000|27.103.77.193|Firefox 

我的代码是:

while [ $# -gt 0 ];do #Get and store Dates (Since-Until) 
    if [ "$1" = --born-since ];then 
    if [[ "$2" =~ $re ]];then #re='[0-9]-*' # Check if $2 is number        
     BSDate=$2 
     BSYear=$(echo "$BSDate" | awk -F '-' '{print $1}') # Get BSYear 
     BSMonth=$(echo "$BSDate" | awk -F '-' '{print $2}') # Get BSMonth 
     BSDay=$(echo "$BSDate" | awk -F '-' '{print $3}') # Get BSDay 
    fi 
    elif [ "$1" = --born-until ];then 
    if [[ "$2" =~ $re ]];then 
      BUDate=$2 
     BUYear=$(echo "$BUDate" | awk -F '-' '{print $1}') # Get BUYear 
      BUMonth=$(echo "$BUDate" | awk -F '-' '{print $2}') # Get BUMonth 
       BUDay=$(echo "$BUDate" | awk -F '-' '{print $3}') # Get BUDay 
     fi 
    fi 
shift 
done 
    if [ "$BSDate" ] && [ "$BUDate" ];then #If both date arguments exist 

    elif [ "$BSDate" ];then 


    elif [ "$BUDate" ];then 

    fi 

如果我进入--Born,因为1998-10-30在awk中,参数正确地通过评估= 1998年= BSYear,10 = BSMonth,30 = BSDay。有人可以帮我实现awk部分吗?

+0

在您输入的”生日“内没有任何日期等于或在”1998-10-30“之后。你写*它工作正常* - 但它应该不输出 – RomanPerekhrest

+0

这就是我想要的。你的观点?该程序将在任何.dat文件上运行。 –

+0

你能显示'./tool.sh --born-自1987-01-01'的预期结果吗? – RomanPerekhrest

回答

1

对于AWK部分:

cat ./tool.sh 
awk -F'|' -vs="$1" -ve="$2" ' 
BEGIN{if(!s)s="0000-00-00";if(!e)e="9999-99-99"} 
NR>1 && $5>=s && $5<=e' infile 

而且你怎么称呼它像

./tool.sh '1987-01-06' '1988-08-02' 

./tool.sh '' '1988-08-02' 

./tool.sh '1987-01-06' '' 
+0

它必须被称为./tool.sh - 自从dateA - 出生 - 直到dateB -f file.Wish我可以这样做。 –

+0

我试过了awk -F'|' '{if($ 5> = $ BSDate && $ 5 <= $ BUDate)print}'$ FILENAME但它不输出任何内容。 –

+0

用$ 2替换$ 1,用$ 4替换$ 2并用$ 6替换,并将其命名为:./tool.sh --born'since'1987-01-06'--born-until'1988-08-02'-f INFILE –

0

我用下面的代码修复了它:awk -F'|' '{if($ 5> =''$ BSDate'“& & $ 5 < =”'$ BUDate'“)