次の形式の2つのcsvファイルがあります。
column1,column2,user,column4,column5,column...column14
ユーザーを最初のキーでファイルをソートし、タイムスタンプを表す数字の列14に基づいて降順にソートしたいと思います。
結果は次のとおりです。
ファイル1:
A,AA,jim,XX,YY,....,1485771395
A,AA,jim,XX,YY,....,1485771395
など
その後、このファイル内の各クラスタの最初の行だけを維持したいと思います。
A,AA,jim,XX,YY,....,1485771395
どうすればいいですか?
修正する:
入力例:
"1/30/2017 11:14:55 AM",Valid customer,jim.smith,NY,1485771295
"1/26/2017 5:06:11 AM",New customer,john.doe,CA,1485403571
"1/26/2017 8:02:01 PM",Valid customer,jim.smith,NY,1485457321
"1/30/2017 4:14:30 AM",New customer,tim.jones,CO,1485746070
"1/30/2017 11:09:36 AM",New customer,tim.jones,CO,1485770976
"1/30/2017 11:14:50 AM",Valid customer,jim.smith,NY,1485771290
"1/22/2017 11:51:51 AM",New customer,tim.jones,CO,1485082311
最後の列は最初の列の時代なので、文字列ではなく数字を使用して行を並べ替えることができます。
したがって、予想される出力は次のようになります。
a)名前とタイムスタンプに基づいて逆順に並べ替えると、次のような結果が得られます。
"1/30/2017 11:14:55 AM",Valid customer,jim.smith,NY,1485771295
"1/30/2017 11:14:50 AM",Valid customer,jim.smith,NY,1485771290
"1/26/2017 8:02:01 PM",Valid customer,jim.smith,NY,1485457321
"1/26/2017 5:06:11 AM",New customer,john.doe,CA,1485403571
"1/30/2017 11:09:36 AM",New customer,tim.jones,CO,1485770976
"1/30/2017 4:14:30 AM",New customer,tim.jones,CO,1485746070
"1/22/2017 11:51:51 AM",New customer,tim.jones,CO,1485082311
jim.smith
したがって、最後の列に基づいて逆順にソートされた行クラスターがありtim.jones
(つまり、最初の行の最も遅い日付がクラスターの最初の日付である)、john.doe
その行のレコードは1つだけです。
その後、各クラスタの最初の行だけを維持したいと思います。つまり
"1/30/2017 11:14:55 AM",Valid customer,jim.smith,NY,1485771295
"1/26/2017 5:06:11 AM",New customer,john.doe,CA,1485403571
"1/30/2017 11:09:36 AM",New customer,tim.jones,CO,1485770976
答え1
与えられたファイルinput
は
"1/30/2017 11:14:55 AM",Valid customer,jim.smith,NY,1485771295
"1/26/2017 5:06:11 AM",New customer,john.doe,CA,1485403571
"1/26/2017 8:02:01 PM",Valid customer,jim.smith,NY,1485457321
"1/30/2017 4:14:30 AM",New customer,tim.jones,CO,1485746070
"1/30/2017 11:09:36 AM",New customer,tim.jones,CO,1485770976
"1/30/2017 11:14:50 AM",Valid customer,jim.smith,NY,1485771290
"1/22/2017 11:51:51 AM",New customer,tim.jones,CO,1485082311
それから
sort -t, -k3,3 -k5,5rn input | awk -F, '!seen[$3]++'
"1/30/2017 11:14:55 AM",Valid customer,jim.smith,NY,1485771295
"1/26/2017 5:06:11 AM",New customer,john.doe,CA,1485403571
"1/30/2017 11:09:36 AM",New customer,tim.jones,CO,1485770976
答え2
そしてgnu datamash
:
datamash -t, -s -f -g 3 max 5 <infile
ただし、実行する前に、入力の各行からすべての末尾のスペースを削除する必要があります。 2つの配列
のみを使用してください。awk
awk -F, '!z[$3]{x[$3]=$0;z[$3]=$5;next}$5>z[$3]{x[$3]=$0}
END{for (i in z){print x[i]}}' infile