Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/shell/5.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
使用unix shell脚本根据csv文件中的列编辑列_Shell_Unix_Scripting - Fatal编程技术网

使用unix shell脚本根据csv文件中的列编辑列

使用unix shell脚本根据csv文件中的列编辑列,shell,unix,scripting,Shell,Unix,Scripting,我有以下表格是csv格式的 2017年4月7日,是 2017年4月8日,是 2017年4月9日,是 2017年4月10日,是 2017年4月11日,是 2017年4月7日,是的 我想将第一列与系统的当前日期进行比较,如果第一列中提到的日期是过去的,那么我想将第二列更改为“否”。结果表为:- 2017年4月7日,编号 2017年4月8日,否 2017年4月9日,是 2017年4月10日,是 2017年4月11日,是 2017年4月7日,第 我尝试了awk语句,但它没有比较日期。如果您知道如何解决此

我有以下表格是csv格式的

2017年4月7日,是
2017年4月8日,是
2017年4月9日,是
2017年4月10日,是
2017年4月11日,是
2017年4月7日,是的

我想将第一列与系统的当前日期进行比较,如果第一列中提到的日期是过去的,那么我想将第二列更改为“否”。结果表为:-

2017年4月7日,编号
2017年4月8日,否
2017年4月9日,是
2017年4月10日,是
2017年4月11日,是
2017年4月7日,第


我尝试了awk语句,但它没有比较日期。如果您知道如何解决此问题,请共享该命令。

这是一个
bash
版本

#!/bin/bash

DATE=`date +%d-%m-%Y`
while read L
do
    D=`echo $L | cut -f1 -d\ `
    if [ $D \< $DATE ]
    then
        echo "$D NO"
    else
        echo "$D YES"
    fi
done <./dates.txt
#/bin/bash
日期=`DATE+%d-%m-%Y`
当我读
做
D=`echo$L | cut-f1-D`
如果[$D\<$DATE]
然后
回显“$D编号”
其他的
回显“$D是”
fi

完成这是一个
bash
版本

#!/bin/bash

DATE=`date +%d-%m-%Y`
while read L
do
    D=`echo $L | cut -f1 -d\ `
    if [ $D \< $DATE ]
    then
        echo "$D NO"
    else
        echo "$D YES"
    fi
done <./dates.txt
#/bin/bash
日期=`DATE+%d-%m-%Y`
当我读
做
D=`echo$L | cut-f1-D`
如果[$D\<$DATE]
然后
回显“$D编号”
其他的
回显“$D是”
fi
完成试试这个-

$awk -v date=$(date '+%d-%m-%Y') '{print ($1 < date?$1 FS "NO": $1 FS "YES")}' f
07-04-2017 NO
08-04-2017 NO
09-04-2017 YES
10-04-2017 YES
11-04-2017 YES
07-04-2017 NO
$awk-v date=$(日期'+%d-%m-%Y'){print($1
根据此命令的注释-今天的结果-

$awk -v date=$(date '+%d-%m-%Y') '{print ($1 < date?$1 FS "NO": $1 FS "YES")}' f
07-04-2017 NO
08-04-2017 NO
09-04-2017 NO
10-04-2017 YES
11-04-2017 YES
07-04-2017 NO
$awk-v date=$(日期'+%d-%m-%Y'){print($1
试试这个-

$awk -v date=$(date '+%d-%m-%Y') '{print ($1 < date?$1 FS "NO": $1 FS "YES")}' f
07-04-2017 NO
08-04-2017 NO
09-04-2017 YES
10-04-2017 YES
11-04-2017 YES
07-04-2017 NO
$awk-v date=$(日期'+%d-%m-%Y'){print($1
根据此命令的注释-今天的结果-

$awk -v date=$(date '+%d-%m-%Y') '{print ($1 < date?$1 FS "NO": $1 FS "YES")}' f
07-04-2017 NO
08-04-2017 NO
09-04-2017 NO
10-04-2017 YES
11-04-2017 YES
07-04-2017 NO
$awk-v date=$(日期'+%d-%m-%Y'){print($1
如果我正确理解了您的问题,则无需依赖任何其他实用程序。您可以使用POSIX外壳参数扩展和子字符串删除来解析
,并将它们放在一个重新格式化的日期字符串中,该字符串可以与
日期-d“字符串”
一起使用,以获得自历元以来的秒数(
1970-01-01 00:00:00 UTC
)并将其与当前日期/时间进行比较,以确定读取的日期是否早于当前日期/时间。如果是,则可以输出“否”

示例:

#!/bin/sh

while IFS=$' \t\n,' read -r fdate ans
do
    yr="${fdate##*-}"    ## parse year
    tmp="${fdate%-$yr}"  ## parse tmp="day-month"
    day="${tmp%-*}"      ## parse day
    mo="${tmp#*-}"       ## parse month
    rfdate="${yr}-${mo}-${day}"   ## create "year-mo-day" string

    ## compare date string with current day/time (seconds since epoch)
    if [ "$(date -d "$rfdate" +%s)" -lt "$(date +%s)" ]
    then
        echo "$fdate, NO"
    else
        echo "$fdate, $ans"
    fi
done < dat/dates 
示例使用/输出

$ cat dat/dates
07-04-2017 ,YES
08-04-2017 ,YES
09-04-2017 ,YES
10-04-2017 ,YES
11-04-2017 ,YES
07-04-2017 ,YES
$ sh datebeforetst.sh <dat/dates
07-04-2017, NO
08-04-2017, NO
09-04-2017, NO
10-04-2017, NO
11-04-2017, YES
07-04-2017, NO
结果:

$ sh datebeforetst.sh <dat/dates
07-04-2017, NO
08-04-2017, NO
09-04-2017, NO
10-04-2017, YES
11-04-2017, YES
07-04-2017, NO

$sh datebeforetst.sh如果我正确理解了您的问题,那么就不需要依赖任何其他实用程序。您可以使用POSIX外壳参数扩展和子字符串删除来解析
,并将它们放在一个重新格式化的日期字符串中,该字符串可以与
日期-d“字符串”
一起使用,以获得自历元以来的秒数(
1970-01-01 00:00:00 UTC
)并将其与当前日期/时间进行比较,以确定读取的日期是否早于当前日期/时间。如果是,则可以输出“否”

示例:

#!/bin/sh

while IFS=$' \t\n,' read -r fdate ans
do
    yr="${fdate##*-}"    ## parse year
    tmp="${fdate%-$yr}"  ## parse tmp="day-month"
    day="${tmp%-*}"      ## parse day
    mo="${tmp#*-}"       ## parse month
    rfdate="${yr}-${mo}-${day}"   ## create "year-mo-day" string

    ## compare date string with current day/time (seconds since epoch)
    if [ "$(date -d "$rfdate" +%s)" -lt "$(date +%s)" ]
    then
        echo "$fdate, NO"
    else
        echo "$fdate, $ans"
    fi
done < dat/dates 
示例使用/输出

$ cat dat/dates
07-04-2017 ,YES
08-04-2017 ,YES
09-04-2017 ,YES
10-04-2017 ,YES
11-04-2017 ,YES
07-04-2017 ,YES
$ sh datebeforetst.sh <dat/dates
07-04-2017, NO
08-04-2017, NO
09-04-2017, NO
10-04-2017, NO
11-04-2017, YES
07-04-2017, NO
结果:

$ sh datebeforetst.sh <dat/dates
07-04-2017, NO
08-04-2017, NO
09-04-2017, NO
10-04-2017, YES
11-04-2017, YES
07-04-2017, NO

$sh datebeforetst.sh逗号分隔值格式的逗号在哪里?请添加您尝试使用的任何awk命令=$(日期'+%m/%d/%Y');awk-F“,”{if($2逗号分隔值格式的逗号在哪里?请添加您尝试使用的任何awk命令=$(日期'+%m/%d/%Y');awk-F“,”{if($2)如果我在一行中编写,上述代码只返回“YES”。在脚本中,它给出了以下错误::length.ksh[5]:[:这可能是因为您使用的是ksh。请改用bash。我稍后会在有时间时编写ksh版本。如果我只在一行中编写,上面的代码只返回“是”。在脚本中,它会给出以下错误::length.ksh[5]:[:这可能是因为您正在使用ksh。请改用bash。我稍后有时间会编写ksh版本。它只返回“是”@BShiva-工作正常,请检查我添加的结果。如果您只得到“是”表示$1始终小于
07-04-2017
可能性很高。如果您的计算机中的日期错误,请粘贴
date'+%d-%m-%Y'
命令的输出。我曾尝试将其应用于一个表中,该表的日期在第二列中,并已将$1更改为$2。但在分隔该列后,得到了正确的结果。谢谢。祝您身体健康r它解决了您的查询:)它只返回“是”@BShiva-它工作正常,请检查我添加的结果。如果您只得到“是”表示$1始终小于
07-04-2017
可能性很高。如果您的计算机中的日期错误,请粘贴
date'+%d-%m-%Y'
命令的输出。我曾尝试将其应用于一个表中,该表的日期在第二列中,并已将$1更改为$2。但在分隔该列后,得到了正确的结果。谢谢。祝您身体健康r它解决了您的查询:)