2017-02-01 8 views
-1

第4列を下位の出力からソートし、最も早い日付のエントリのみを報告するのに役立つ必要があります。日付の特定の列をソートし、最も早い日付を取得

電流出力:

Node_name:ABCD Lastacc :2017-01-05 Info  :testing *Endtime :2016-12-11* Type  :Exist 
Node_name:ABCD Lastacc :2017-01-05 Info  :testing *Endtime :2016-12-11* Type  :Exist 
Node_name:ABCD Lastacc :2017-01-05 Info  :testing *Endtime :2016-12-15* Type  :Exist 

予想される出力:以下

Node_name:ABCD Lastacc :2017-01-05 Info  :testing *Endtime :2016-12-15* Type  :Exist 
+0

いずれかが**第4列ですか?あなたの質問を編集し、詳細を追加する –

答えて

0

昇順で並べ替えられますし、あなたのファイル-K3

ソートファイルの最後の行をgrepします|尾-n 1

1

sort -k7 -r your_file.log | head -n 1

-k7:例の出力はbashでスペースで区切られているため、7番目の列(:2016-12-11)でソートする必要があります。

-r:出力を元に戻すので、最新(=最新)の日付が最初の行に表示されます。本当に興味のあるものが最も古い(=最も古い)日付を削除してください。

0

ソート順とソート順に応じた最初の行/最後の行をベースにした解決方法が有効です。

多くのデータがある場合、並べ替えは計算量が多くなります。最新の行のみを必要とするため、すべての行を解析し、ファイル全体をスキャンし、最新のメモリを保持します他のものを並べ替える必要があります)。

このようにすることができます。

#!/bin/bash 
data_file="data_file" 
regex="Endtime :([0-9-]+)" 
while IFS= read -r line 
do 
    [[ $line =~ $regex ]] || continue 
    match="${BASH_REMATCH[1]}" 
    [[ "$match" < "$newest" ]] || { newest="$match" ; newest_line="$line" ; } 
done <"$data_file" 
echo "$newest_line" 

は、あなたの特定のケースのために、ワンライナーsort/cutソリューションは十分に速くたくさんある、ということは非常に可能性があり、この場合には短い方が良いですが、1億行のファイルに、あるでしょう適切なアルゴリズムを選択することにより、巨大なパフォーマンスの違い。

日付を読み取るために使用される正規表現は粗末であり、日付はすべて同じ有効な形式であることを前提としています(これ以上解析することなく直接比較することができます)。その式をYYYY-MM-AAフォーマットにさらに慎重に一致させるように変更することをお勧めします。

関連する問題