我有一系列具有以下語法的行:
sweets apple:11 banana:9 cherry:101 donut:1 egg tart:86
tossed added:5 anted:13 ashley:3 bandied:3 flung:6 lobbed:4 salad:26 slung:9
plenty abundance:3 a lot:83 ample:12 aroar:3 a ton:12 enow:5 gobs:5 lots:27 lotsa:8
(the large spaces are all tabs)
所需的輸出是按冒號后面的數字按數字排序的第 2 列。例如
sweets cherry:101 egg tart:86 apple:11 banana:9 donut:1
tossed salad:26 anted:13 slung:9 flung:6 added:5 lobbed:4 ashley:3 bandied:3
plenty a lot:83 lots:27 a ton:12 ample:12 lotsa:8 abundance:3 enow:5 gobs:5 aroar:3
我經常使用紅寶石單線..
//alphabetize within a line, delimited by pipes "|"
ruby -pe '$_=$_.strip.split("|").sort().join("|") "\n"'
//case insensitive with no dupes:
ruby -pe '$_=$_.strip.split("|").sort_by{|x| x.downcase }.uniq.join("|") "\n"'
//keep the first term:
ruby -pe '$_=$_.split(":")[0].strip ":" $_.split(":")[1].strip.split("|").sort.join("|") "\n"'
但是我不能完全用一種簡單而干凈的方式來按尾隨數字排序。即“:NN”。我相信這可以用幾個字符來完成。如何?我也為 awk 解決方案感到高興,但對于更復雜的處理,ruby 通常更清潔。
uj5u.com熱心網友回復:
鑒于:
cat file
headword apple:11 zanana:9 cherry:101 donut:1 egg tart:86
在 Ruby 中,我會這樣做:
ruby -F"\t" -lane 'puts $F.sort_by{ |w|
idx=w[/(?<=:)\d /]
if (idx.nil?)
-1/0.0
else
-idx.to_i
end
}.join("\t")' file
或者如果我們知道第一個單詞不被排序并且其余的有數字,你可以這樣做:
ruby -F"\t" -lane 'hw, *arr = $F; puts "#{hw}\t#{arr.sort_by{ |w| -w[/(?<=:)\d /].to_i }.join("\t")}"' file
或者在 GNU awk 中,你可以這樣做:
awk 'BEGIN{OFS="\t"}
function byn(i1, v1, i2, v2, l, r)
{
if (index(v1,":")==0 || index(v2,":")==0) return -1
split(v1,va1,/:/)
split(v2,va2,/:/)
if (va1[2]>va2[2])
return -1
else if (va1[2]==va2[2])
return 0
else
return 1
}
{split($0, fields, /\t /)
asort(fields, result, "byn")
for (i=1; i<=length(result); i )
printf "%s%s", result[i], i==length(result) ? ORS : OFS}' file
所有三個列印:
headword cherry:101 egg tart:86 apple:11 zanana:9 donut:1
uj5u.com熱心網友回復:
假設是在字符a上分割每一行的結果。\t
irb(main):009:0> "#{a[0]}\t#{a[1..].sort { |a, b| b.split(":")[1].to_i <=> a.split(":")[1].to_i }.join("\t")}"
=> "headword\tcherry:101\tegg tart:86\tapple:11\tbanana:9\tdonut:1"
每行都在選項卡上拆分。這給了我們一個陣列:
["headword", "apple:11", "banana:9", "cherry:101", "donut:1", "egg tart:86"]
我們可以不理會第一個元素。然后,我們可以通過將剩余元素拆分為鍵/值對并比較每個元素的第二個元素來對它們進行排序。如果我們比較b,a我們會得到降序。
ruby -pe 'a=$_.split("\t");puts "#{a[0]}\t#{a[1..].sort{|a,b|b.split(":")[1].to_i<=>a.split(":")[1].to_i}.join("\t")}"'
uj5u.com熱心網友回復:
str = "headword\tapple:11\tbanana:9\tcherry:101\tdonut:1\tegg tart:86"
hw, *arr = str.split("\t")
hw
#=> "headword"
arr
#=> ["apple:11", "banana:9", "cherry:101", "donut:1", "egg tart:86"]
[hw, *arr.sort_by { |s| -s[/(?<=:)\d /].to_i }].join("\t")
#=>"headword\tcherry:101\tegg tart:86\tapple:11\tbanana:9\tdonut:1"
uj5u.com熱心網友回復:
> str = "headword\tapple:11\tbanana:9\tcherry:101\tdonut:1\tegg tart:86"
=> "headword\tapple:11\tbanana:9\tcherry:101\tdonut:1\tegg tart:86"
> (x = str.split("\t"))[1..-1].sort_by { |x| x.split(':')[-1].to_i }.reverse.prepend(x[0]).join("\t")
=> "headword\tcherry:101\tegg tart:86\tapple:11\tbanana:9\tdonut:1"
uj5u.com熱心網友回復:
將 GNU awk 用于sorted_in:
$ cat tst.awk
BEGIN {
FS=OFS="\t"
PROCINFO["sorted_in"] = "@val_num_desc"
}
{
for (i=2; i<=NF; i ) {
split($i,t,":")
nums[i] = t[2]
}
out = $1
for (i in nums) {
out = out OFS $i
}
print out
}
$ awk -f tst.awk file
sweets cherry:101 egg tart:86 apple:11 banana:9 donut:1
tossed salad:26 anted:13 slung:9 flung:6 added:5 lobbed:4 bandied:3 ashley:3
plenty a lot:83 lots:27 a ton:12 ample:12 lotsa:8 enow:5 gobs:5 aroar:3 abundance:3
如果您真的發現出于某種原因將其全部塞入“單線”很有用,那么您當然可以:
$ awk -F'\t' 'BEGIN{PROCINFO["sorted_in"]="@val_num_desc"} {for(i=2;i<=NF;i ){split($i,t,":");n[i]=t[2]}o=$1;for(i in n)o=o FS $i;print o}' file
sweets cherry:101 egg tart:86 apple:11 banana:9 donut:1
tossed salad:26 anted:13 slung:9 flung:6 added:5 lobbed:4 bandied:3 ashley:3
plenty a lot:83 lots:27 a ton:12 ample:12 lotsa:8 enow:5 gobs:5 aroar:3 abundance:3
但它失去了一點清晰度。
uj5u.com熱心網友回復:
不是單線,而是我的看法:
line = "headword\tapple:11\tbanana:9\tcherry:101\tdonut:1\tegg tart:86"
fields = line.split(/\t/)
result = [fields[0]]
.concat(
fields[1..-1]
.map {|each| each.split(":")}
.sort {|a, b| b[1].to_i <=> a[1].to_i}
.map {|each| each.join(":")}
)
.join "\t"
轉載請註明出處,本文鏈接:https://www.uj5u.com/qukuanlian/455226.html
上一篇:Ruby/rails/鏈接方法
