나는 다음과 같은 약 2,000개의 정보 세트를 포함하는 매우 긴 파일을 가지고 있습니다.http://pastebin.com/raw/vKxRNviT
달러 잔액을 기준으로 가장 높은 것부터 낮은 것 순으로 정리해야 합니다. 저울과 위의 따옴표 안에 있는 긴 영숫자 문자열만 있으면 됩니다. 다른 정보는 필요하지 않습니다. grep이나 다른 프로세스를 사용하여 이 작업을 어떻게 수행할 수 있나요?
답변1
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 . . .
답변2
여기:
#!/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
쉘 도구는 보기 흉하고 더 나은 언어가 있습니다.
답변3
일반적인 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