2016-05-04 13 views
-1

特定のアカウントの残高が異なるファイルがあります。そして、毎日これらのバランスが変わります。私がしたいのは、最新の日付に基づいて特定のアカウントの残高記録を抽出することです。最新の日付に基づいてファイルからレコードを抽出し、新しいファイルに保存する

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 

ご注意ください第四のデータフィールドは毎日変更されます

+0

入力ファイルには1行しか含まれていませんか?そうでない場合は、投稿されたサンプルデータが実際のデータを表していないため、有用ではありません。あなたの質問を編集して、簡潔で、テスト可能で、本当に代表的なサンプル入力と、その入力を想定した出力を含めます。 –

答えて

0

メインファイルが常に "something_date"の形式になる場合、これはOKです。

#!/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 

注:これはコメントのサンプルと連携していますが、必要に応じて必ず2つにする必要があります。とにかく、それはあなたを得るために十分であるはずです。お役に立てれば!

+0

これは、ファイルのソートに役立ちます。しかし、私の質問は、出力ファイルから別のファイルに最新の日付エントリを抽出する方法です。例えば は、我々はあなたの出力を考慮した場合: 20151201〜1232455767 ~~ 0〜149038.40000000〜149038.4〜0.00000000〜0.00000000〜0.00000000 20151202〜1232455767 ~~ 0〜178638.40000000〜149038.4〜0.00000000〜0.00000000〜0.00000000 20151201〜2341245456 ~~ 0 〜149038.40000000〜149038.4〜0.00000000〜0.00000000〜0.00000000 最初の2レコードのアカウント番号が同じで、出力ファイルに20151202レコードを取得したい場合は、バランス(5番目のフィールド)を大きくします。 可能ですか? – Pranav

+0

私はあなたに与えることができる唯一の解決策はかなり長いwhileループです。私は出力をフィルタリングするために 'awk'や' perl'を使ってファンシーなライナーを提案できるよりも経験豊かな人がいると確信しています。 –

関連する問題