根据最新日期从文件中提取记录并存储在新文件中

时间:2016-05-04 12:31:38

标签: bash shell unix awk

我有一个特定帐户余额不同的文件。每天这些平衡都会发生变化。我想要做的是根据最新日期提取特定账户的余额记录。

我正在遵循一种方法,我使用awk脚本手动将日期添加到第一列记录中,但是从文件名中取出日期,因为我没有在记录中获取日期。接下来,我想根据帐号对记录进行排序,并希望在另一个文件中提取最新日期的记录。

有人可以帮我吗?

直到现在我已编写此代码,我无法将数据排序并提取到其他文件

#!/usr/bin/ksh

f=mainfile_20151201.dat
s=`echo $f | cut -c 16-23`
echo "$f -> $s"

awk -F "~" 'BEGIN { OFS = "~"; ORS = "\n" ; date='$s' ; IFS = "~"} { $1=date"~"$1 ; print  }' mainfile_20151201.dat > tempdate

awk -F "~" 'BEGIN { OFS = "~"; ORS = "\n" ;  IFS = "~"} { $1 ; print  }' tempdate > newfile

示例数据:

AccountNumber~~0~149038.40000000~149038.4~0.00000000~0.00000000~0.00000000

请注意,第4个字段中的数据每天都会更改

1 个答案:

答案 0 :(得分:0)

如果您的主文件始终采用" something_date"这应该可以胜任。

#!/bin/bash
f=mainfile_20151201.dat
s=`echo $f | cut -d"_" -f2`
echo "$f -> $s"
awk -F "~" 'BEGIN { OFS = "~"; ORS = "\n" ; date='$s' ; IFS = "~"} { $1=date"~"$1 ; print  }' mainfile_20151201.dat > tempdate
awk -F "~" 'BEGIN { OFS = "~"; ORS = "\n" ;  IFS = "~"} { $1 ; print  }' tempdate > newfile
 rm tempdate

sort -u -t~ -k 2 <newfile >newfile.s
#sort by unique arange by field 2 then field 1 (default action)

d=$(cat newfile.s | head -1 | cut -d"~" -f1) #get first date
a=$(cat newfile.s | head -1 | cut -d"~" -f2) #get first account number

while read line; do
 d2=`echo "$line" | cut -d"~" -f1` #get date from line
 a2=`echo "$line" | cut -d"~" -f2` #get account from line
if [[ $a2 == $a ]] && [[ $d2 > $d ]] || [[ $d2 == $d ]];then #if acount are same but date is 'bigger' OR the same
 sed -i '$ d' output.txt #remove last line of file
 echo "$line" >> output.txt #append to file
 a="$a2" #set new account for later
 d="$d2" #set new date for later
else
 a="$a2"
 d="$d2"
 echo "$line" >>output.txt
fi
done <newfile.s #while input declaration

注意:这与评论中的示例一起使用,但肯定需要根据您的需求进行调整。无论如何,它应该足以让你前进。希望这有帮助!