答案是肯定的。与其尝试将整个文件读入脚本中的某种存储形式,只需 read 一次一行,并与每行中的 date 部分进行必要的比较,然后输出日期(用于重定向到第二个文件)。例如,您可以使用简单灵活的脚本,将 compare date 作为其第一个参数,然后从作为第二个参数给出的文件名中读取(或从 stdin默认)。例如
#!/bin/bash
[ -z $1 ] && { ## validate compare date term provided
printf "error: insufficient input, usage: %s cmpdate [file (stdin)]\n" \
"${0##*/}"
exit 1
}
cmpdt="${1:-20160401}" ## compare date (default 20160401)
fname="${2:-/dev/stdin}" ## filename (default stdin)
while IFS=$',\n' read -r num dt; do ## read num, dt from each line
[ "$dt" -ge "$cmpdt" ] && echo "$dt" ## compare date/output
done <"$fname"
示例使用/输入/输出文件
使用您的比较日期20160401,以及存储在dat 目录中的输入文件为ndate.csv:
$ cat dat/ndate.csv
1292177423,20160206
1292177450,20160326
1292177503,20160204
1234263435,20160130
1234263464,20160219
1234263557,20160218
1234263564,20160321
1234263569,20160219
1292177912,20160314
1292177423,20160319
1292177450,20160326
1292177503,20160329
1234263435,20160401
1234263464,20160402
1234263557,20160405
1234263564,20160410
1234263569,20160418
1292177912,20160419
您可以使用上述脚本检查哪个日期大于或等于20160401,然后将匹配的日期转储到stdout:
$ bash cmpdates.sh 20160401 <dat/ndate.csv
20160401
20160402
20160405
20160410
20160418
20160419
当您对一切正常工作感到满意时,只需将输出重定向到一个新文件,例如dat/ndatenew.txt
$ bash cmpdates.sh 20160401 <dat/ndate.csv >dat/ndatenew.txt
$ cat dat/ndatenew.txt
20160401
20160402
20160405
20160410
20160418
20160419
要以xxxxxyyyyy 格式输出数据,您只需更改回显的信息,例如:
while IFS=$',\n' read -r num dt; do ## read num, dt from each line
[ "$dt" -ge "$cmpdt" ] && echo "${num:0:5}${dt:0:4}" ## compare date/output
done <"$fname"
这会导致:
$ bash cmpdates.sh 20160401 <dat/ndate.csv
123422016
123422016
123422016
123422016
123422016
129212016
全部查看,如果您有任何问题,或者我误解了您在 file2 中想要的信息,请告诉我。