bash脚本逐行读取文本文件并进行比较

时间:2016-04-19 16:14:33

标签: bash shell

我有一个格式为的文本文件:

1292177423,20160206
1292177450,20160326
1292177503,20160204
1234263435,20160130
1234263464,20160219
1234263557,20160218
1234263564,20160321
1234263569,20160219
1292177912,20160314
abcde*****,yyyymmdd

=====

我想将yyyymmdd20160115进行比较。如果> 20160115我想把这一行放到2个新文件中(1只有数字abcde *****,1有行相同的旧文件号,yyyymmdd)

我可以用bash脚本或perl脚本吗,因为这些文件的大小非常大?以及如何用bash脚本做到这一点?感谢

2 个答案:

答案 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是满足条件的记录子集