編集:
こんにちはuser84771さん
だから私はあなたが言ったことに基づいて私の答えを完全に作り直しました。さらにいくつかの行がありますが、これがあなたが探しているものであることを願っています:
Mysql の group by と同様に、「各 ID」から最大の行を見つけるには、次のようにします。
次のテキスト ファイルがあるとします。
[root@dev7 ~]# cat stackoverflow2.log
ID1, fdsgfdsggfdsgsdfg
ID1, fdsgsdfg
ID1, fdsgfdgdsfgdsgsdfgdgffdsgfsdg
ID1, fdsgsdfg
ID2, fdgsfdsgfdshshdsfhdfghdsfhdfhdshsdfhsfdh
ID2, fsfgsdgf
ID3, fdgfdgdgfdggfdg
[root@dev7 ~]#
私は次のことをします:
_DATAFILE=stackoverflow2.log
_KEYS=$(awk '{ $1=$1; print $1}' ${_DATAFILE} | uniq | sed "s,\,,,g" | xargs )
_LARGEST_PER_KEY=""
echo $_KEYS
for i in ${_KEYS}; do
_LARGEST_PER_KEY="${_LARGEST_PER_KEY}\n$(grep "$i" ${_DATAFILE} | uniq | awk '{ print length ":", $0 }' | sort -n -u | tail -1 | cut -d ":" -f2 | awk '{ $1=$1; print}')"
done;
echo -e ${_LARGEST_PER_KEY}
何が起こっているのかを説明する。
- _DATAFILE - この変数は入力ファイルです。
- _KEYS - この変数は、最初の列内のすべてのキーを返します (uniq および関連付けられたデータなしで並べ替えられた)。xargs を使用して、次のステップのためにすべてのキーが一直線になるようにしました。
[root@dev7 ~]# _KEYS=$(awk '{ $1=$1; print $1}' ${_DATAFILE} | uniq | sed "s,\,,,g" | xargs )
[root@dev7 ~]# echo $_KEYS
ID1 ID2 ID3
_LARGEST_PER_KEY - この変数は、完了時に結果に使用されます。ここで for ループの前に定義します。
for ループは、クエストのキー (例: ID1 ) の grep を実行し、コードのフォーム行を実行して、どれが最長のデータ値を含むかを判断し、数値/一意の並べ替えを実行して、どれが最大かを確認します。tail を使用してその値を取得し、_LARGEST_PER_KEY 文字列に追加します。(注: \n 文字を区切り文字として追加します)
for ループが終了したら、echo -e を使用して結果をエコーアウトし、改行文字が画面上で正しく評価されるようにします。
[root@dev7 ~]# echo -e ${_LARGEST_PER_KEY}
ID1、fdsgfdgdsfgdsgsdfgdgffdsgfsdg
ID2、fdgsfdsgfdshshdsfhdfghdsfhdfhdshsdfhsfdh
ID3、fdgfdgdgfdggfdg
注: 最初にすべてを並べ替えたので、再度並べ替える必要はありません。
明確化のためのメモ:
awk '{ $1=$1; print}' - これにより、末尾の空白が削除されます (行頭 / 行末)
uniq - 重複を取り除きます
awk '{ print length ":", $0 }' - 各行の行の長さを取得し、「行の長さ」で出力します:「行テスト」
sort -n -u - 数値ソート (最大数が最後の項目です)。また、データファイルがソートされずに到着した場合、ファイル全体が一意にソートされるようにします。先端
グレンをありがとう。
tail -1 - 最大の行から最後の行を取得します
cut -d ":" -f2 - 正確な行のみが必要な場合は、行の長さを取り除き、単に行を返します
awk '{ $1=$1; print}' - これにより、末尾の空白が削除されます (行頭 / 行末)
繰り返しますが、これを行うにはもう少し効率的な方法があると確信していますが、これが私が思いついたものです。お役に立てれば!