ksh의 2개 필드를 기준으로 정렬

ksh의 2개 필드를 기준으로 정렬
file-
xyz.161209:/userlogs/logs/reports 355G 195G 150G 57% /home
xyz.161209:/userlogs/logs/reports 355G 197G 148G 58% /home
xyz.161209:/userlogs/logs/reports 355G 201G 145G 59% /home
xyz.161210:/userlogs/logs/reports 355G 218G 129G 63% /home
xyz.161210:/userlogs/logs/reports 355G 223G 124G 65% /home
xyz.161210:/userlogs/logs/reports 355G 226G 121G 66% /home
xyz.161211:/userlogs/logs/reports 355G 210G 136G 61% /home
xyz.161211:/userlogs/logs/reports 355G 220G 127G 64% /home
xyz.161211:/userlogs/logs/reports 355G 173G 171G 51% /home

Result
xyz.161209:/userlogs/logs/reports 355G 201G 145G 59% /home
xyz.161210:/userlogs/logs/reports 355G 226G 121G 66% /home
xyz.161211:/userlogs/logs/reports 355G 220G 127G 64% /home

정렬된 날짜가 포함된 각 첫 번째 열에 대해 첫 번째 열을 기준으로 그룹화하고 백분율이 가장 높은 다섯 번째 열이 포함된 행만 표시합니다.

다음은 내가 시도한 내용이지만 원하는 결과를 얻을 수 없습니다. 누구든지 나를 도와줄 수 있나요?

awk -F, '{if ((a[substr($1,5,6)] == substr($1,5,6)) && (b[substr($5,1,2)] < substr($5,1,2)))b[substr($5,1,2)]=substr($5,1,2);}END{for(i in a){print i,a[i];}}' test.txt

답변1

이것이 제가 생각해낸 것입니다. 이것이 가장 효율적인 방법이라고 생각하고 더 효율적인 것을 보고 싶습니다. 그러나 작업이 완료됩니다.

sort test.txt | awk -F':' '{print $1}' | uniq > unique.txt

while read p; do
  grep $p test.txt | sort -r -k5 | head -1
done < unique.txt
rm unique.txt

설명하다:

sort test.txt | awk -F':' '{print $1}' | uniq > unique.txt 목록에서 모든 고유 파일 이름을 추출합니다.

grep $p test.txt | sort -r -k5 | head -15번째 필드(% 값 포함)를 기준으로 내림차순으로 정렬하고 첫 번째 행만 인쇄합니다.

답변2

이것은 나에게 효과적입니다 ksh.

sort -nrk5 -t ' ' test.txt | sort -t '.' -unk2

이 테스트 파일이 주어지면:

  • otherfile_.161209:/userlogs/logs/reports 000G 000G 000G 55% /home
    somefile_.161209:/userlogs/logs/reports 000G 000G 000G 45% /home
    file71.161209:/userlogs/logs/reports 000G 000G 000G 71% /home
    file_longer_12.161209:/userlog/log/report000G 000G 000G78%/집
    qwerty_.161210:/userlogs/logs/reports 000G 000G 000G 31% /home
    xyz.161210:/userlogs/logs/reports 000G 000G 000G 34% /home
    abcdef.161210:/userlogs/logs/reports 000G 000G 000G85%/집
    hellojoe_.161210:/userlogs/logs/reports 000G 000G 000G 45% /home
    kitchen_.161211:/userlogs/logs/reports 000G 000G 000G 39% /home
    room.161211:/userlogs/logs/reports 000G 000G 000G95%/집
    Rooftop_77.161211:/userlogs/logs/reports 000G 000G 000G 12% /home
    f.161211:/userlogs/logs/reports 000G 000G 000G 30% /home

결과는 다음과 같습니다.

  • file_longer_12.161209:/userlog/log/report000G 000G 000G78%/집
    abcdef.161210:/userlogs/logs/reports 000G 000G 000G85%/집
    room.161211:/userlogs/logs/reports 000G 000G 000G95%/집

따라서 다음 파일 이름을 허용합니다.

  • 길이가 다양해
  • 숫자가 포함되어 있습니다.

분해:

  • sort -nrk5 -t ' ': 처음에는 5열에 백분율로 정렬되어 있습니다.
  • sort -t '.' -unk2:첫 번째 필드에서만 날짜 문자열을 계산하여 고유한 결과를 인쇄합니다( .구분 기호 사용).

답변3

이거 어때요?

awk -F"[.: ]" '{if($(NF-1)+0>Arr[$2]+0){Arr[$2]=$(NF-1)+0;Res[$2]=$0}}END{for (i in Res){print Res[i]}}' file
xyz.161210:/userlogs/logs/reports 355G 226G 121G 66% /home
xyz.161211:/userlogs/logs/reports 355G 220G 127G 64% /home
xyz.161209:/userlogs/logs/reports 355G 201G 145G 59% /home


awk -F"[.: ]" '{
if($(NF-1)+0>Arr[$2]+0)
{
   Arr[$2]=$(NF-1)+0;
    Res[$2]=$0
}
}
END{
for (i in Res)
{
print Res[i]
}
}' file

관련 정보