0

名前と時刻があるファイルがあります。最新の時刻だけでエントリを保持したい。どうすればいいのですか?

例えば:

>cat user.txt
"a","03-May-13
"b","13-May-13
"a","13-Aug-13
"a","13-May-13

コマンドを使用していsort -u user.txtます。次の出力が得られます。

"a","11-May-13
"a","13-Aug-13
"a","13-May-13
"b","13-May-13

しかし、次の出力が必要です。

"a","13-Aug-13
"b","13-May-13

誰か助けてくれませんか?

ありがとう。

4

4 に答える 4

3

これを試して:

sort -t, -k2 user.txt | awk -F, '{a[$1]=$2}END{for(e in a){print e, a[e]}}' OFS=","

説明:

エントリを日付フィールドで昇順に並べ替え、並べ替えた結果を awk にパイプします。これは最初のフィールドをキーとして使用するだけなので、同じキーを持つエントリの最後のエントリのみが保持され、最終的に出力されます。

編集

さて、エントリを辞書順で並べ替えることができません。数値で比較できるように日付をタイムスタンプに変換する必要がある場合は、次を使用します。

awk -F",\"" '{ cmd=" date --date " $2 " +%s "; cmd | getline ts; close(cmd); print ts, $0, $2}' user.txt | sort -k1 | awk -F"[, ]" '{a[$2]=$3}END{for(e in a){print e, a[e]}}' OFS=","

MacOS を使用している場合は、gdate代わりに次を使用します。

awk -F",\"" '{ cmd=" gdate --date " $2 " +%s "; cmd | getline ts; close(cmd); print ts, $0, $2}' user.txt | sort -k1 | awk -F"[, ]" '{a[$2]=$3}END{for(e in a){print e, a[e]}}' OFS=","
于 2013-05-24T06:54:57.237 に答える
1

年、月、日を並べ替える必要があると思います。

これを試すことができますか

awk -F"\"" '{print $2"-"$4}' data.txt | sort -t- -k4 -k3M -k2 | awk -F- '{kv[$1]=$2"-"$3"-"$4}END{for(k in kv){print k,kv[k]}}'
于 2013-05-24T07:57:19.957 に答える
0

これはどう?

grep `cut -d'"' -f4 user.txt | sort -t- -k 3 -k 2M -k 1n | tail -1` user.txt

説明:あなたが行ったようにソートを使用して、テール-1で最新のエントリを取得し、その日付(カンマ区切りで切り取った場合の2番目の列)を抽出してから、ソートしてgrepします。

編集:月でソートするように修正。

于 2013-05-24T07:23:30.807 に答える
0

私にとって、これは仕事をしています。月で並べ替えてから、@neevek が使用したロジックを適用しています。これまでのところ、これに失敗するケースを見つけることができません。しかし、これが完全な証明ソリューションであるかどうかはわかりません。

sort -t- -k2 -M user1.txt | awk -F, '{a[$1]=$2}END{for(e in a){print e, a[e]}}' OFS=","

このソリューションに問題があるかどうか教えてもらえますか?

于 2013-05-24T07:38:01.780 に答える