使用unix shell脚本根据csv文件中的列编辑列
我有以下表格是csv格式的 2017年4月7日,是使用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语句,但它没有比较日期。如果您知道如何解决此
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它解决了您的查询:)