Как я могу отсортировать определенные строки строк из этого файла на моем сервере Ubuntu?

У меня есть очень длинный файл, содержащий около 2000 групп информации, которые выглядят следующим образом: http://pastebin.com/raw/vKxRNviT

Мне нужно организовать их по доллару- баланс от самого высокого до самого низкого. Мне нужен только этот баланс и длинная строка буквенно-цифровых символов в кавычках над ним. Остальная информация мне не нужна. Как я могу сделать это с помощью grep или другого процесса?

0
20.06.2016, 18:19
3 ответа

С GNU grep, GNU sed, GNU sort и awk:

grep -e '{' -e 'dollar' file | sed '/{/{N;s/\n//}' | sort -t = -k2nr | awk -F'[="]' '{print $2,$4}'

Выход:

01d6e250-9e4f-495b-92c2-a8fac850f4d6 877164.34
01eea52c-0419-40b3-838f-6cd5300d4393 101149
00315457-ca9e-4c45-87e6-eef632acffce 25004
00b5c95a-8a78-4faa-9d13-a83aa20d4702 25000
00e9b66b-3afa-4182-b024-a38cd40c5876 23088
0180df94-40e3-41c9-a390-41c69141c9f4 22403
0216b500-4390-4ef1-8e60-15d731474b1d 11200
0111590b-776b-496f-8511-a2f81bcb010f 10500
017a80b9-80af-41ca-ad4f-3ec4671b2cdb 10056
0114a6b9-c6ff-444f-9673-a5045dfbb2bc 9999
007580c0-f7e7-4f04-8aa5-6c324d929e68 8723
006d28bd-1e08-40d3-a148-5d9e0133aeee 7818
006da420-7f46-449a-a52d-c55e8fd7e0a2 7557
00522450-e244-434d-a753-d16f5ef896c4 6280
0049b90a-c725-4bd2-8d52-fa55f42395b0 500
.
.
.
1
28.01.2020, 02:48

Типичная однострочная проблема sed.

Шаблон:

/^"/ {s/[^a-zA-Z0-9]//g; h;}; /^ *dollar\-balance/ {s/^[^=]*=//; H; x; s/\n/\t/; p;}

Использование и вывод:

$ cat /tmp/file | sed -ne '/^"/ {s/[^a-zA-Z0-9]//g; h;}; /^ *dollar\-balance/ {s/^[^=]*=//; H; x; s/\n/\t/; p;} ' | sort -k2 -n -r 
01d6e2509e4f495b92c2a8fac850f4d6        877164.34
01eea52c041940b3838f6cd5300d4393        101149
00315457ca9e4c4587e6eef632acffce        25004
00b5c95a8a784faa9d13a83aa20d4702        25000
00e9b66b3afa4182b024a38cd40c5876        23088
0180df9440e341c9a39041c69141c9f4        22403
0216b50043904ef18e6015d731474b1d        11200
0111590b776b496f8511a2f81bcb010f        10500
017a80b980af41caad4f3ec4671b2cdb        10056
0114a6b9c6ff444f9673a5045dfbb2bc        9999
007580c0f7e74f048aa56c324d929e68        8723
006d28bd1e0840d3a1485d9e0133aeee        7818
006da4207f46449aa52dc55e8fd7e0a2        7557
00522450e244434da753d16f5ef896c4        6280
0049b90ac7254bd28d52fa55f42395b0        500
0026f0106e024cae8dcd9727e827c4b3        254
011fad686387490d831c76121814f79b        26
0042cb01d6584cfe84f998ba836a57ac        1
02270abe4335492b8d78bf02ebf9c48a        0
01ed770c17bc4b9e9c4811c870432bbe        0
0191ca39bc524335934b7f7b7f26232a        0
018cab6ed54c45bd95cbc297662042ca        0
0148384a33ab487a931402909c64274c        0
0148059b621f44398b1f30152c4ea184        0
01461ff6bbe548a595c1f59e717b756e        0
0126a8d26d4c4721957a59b381bc0c1a        0
009889c364e044f0bc9545f3f7aa7df6        0
007fa95fe5394812988a8b1b6480bc1c        0
007301788b2d4a1a999d7970f57486db        0
0072e6790f2548ab86c0d5b135a40aac        0
003063eebb5647e6bf6107ed6166e3b1        0
00102e85b9ee4b34b6093237faf18c08        0
0
28.01.2020, 02:48

Здесь:

#!/usr/bin/env ruby

balance = {}

while line = gets
  if line =~ /^\s*"(\S+)"\s* {/
    id = $1
  end
  if line =~ /^\s*dollar-balance=([\d\.]+)/
    dollars = $1
  end
  if id and dollars
    balance[id] = dollars.to_i
    id = nil
    dollars = nil
  end
end

balance.sort_by { |id, dollars| dollars }.reverse.each do |id, dollars|
  puts "#{id} #{dollars}"
end

Shell-инструменты уродливы, есть языки получше.

0
28.01.2020, 02:48

Теги

Похожие вопросы