我有一个格式为的文本文件:
1292177423,20160206
1292177450,20160326
1292177503,20160204
1234263435,20160130
1234263464,20160219
1234263557,20160218
1234263564,20160321
1234263569,20160219
1292177912,20160314
abcde*****,yyyymmdd
=====
我想将yyyymmdd
与20160115
进行比较。如果> 20160115
我想把这一行放到2个新文件中(1只有数字abcde *****,1有行相同的旧文件号,yyyymmdd)
我可以用bash脚本或perl脚本吗,因为这些文件的大小非常大?以及如何用bash脚本做到这一点?感谢
答案 0 :(得分:0)
答案是肯定的。不要试图将整个文件读入脚本中的某种形式的存储,而是一次read
一行,并在每行中与 date 部分进行必要的比较,然后输出日期(用于重定向到第二个文件)。例如,你可以使用一些简单,灵活的脚本,将比较日期作为第一个参数,然后从作为第二个参数给出的文件名中读取(或从{{1} } 默认情况下)。 e.g。
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"
仔细看看,如果您有任何问题,或者我误解了您在file2中想要的信息,请告诉我。
答案 1 :(得分:0)
awk
救援!
文件大小并不重要。
awk -F, '$2>20160115{print $1 > "file1"; print > "file2"}' file
其中file1只有第一个字段,file2是满足条件的记录子集