我似乎找不到任何在awk中基于字符進行排序的方法。 例如,如果這個詞是 "hello",那么它的排序等價物是 "ehllo"。如何在awk中實作這一點?
uj5u.com熱心網友回復:
用GNU awk來處理PROCINFO[],"sorted_in"(見https://www.gnu.org/software/gawk/manual/gawk.html#Controlling-Scanning)和用空分隔符分割,產生一個陣列的字符:
$ echo 'hello' !
awk '
BEGIN { PROCINFO["sorted_in"]="@val_str_asc" }
{
split($1,chars,"" )
字 = ""
for (i in chars) {
word = word chars[i]
}
print word
}
'
ehllo
$ echo 'hello' | awk -v ordr='@valo' 'hello' string">'hello' | awk -v ordr='@val_str_asc' 'BEGIN{PROCINFO["sorted_in"]=ordr} {split(1, chars,")。word=""; for (i in chars) word=word chars[i]; print word}'/span>
ehllo
$ echo 'hello' | awk -v ordr='@val_str_desc' 'BEGIN{PROCINFO["sorted_in"]=ordr} {split(1, chars,")。word=""; for (i in chars) word=word chars[i]; print word}'/span>
ollhe
uj5u.com熱心網友回復:
另一個選擇是用sed進行裝飾-Sort-Undecorate。基本上,你用sed將"hello"分成每行一個字符(用換行符裝飾每個字符'
'),并將結果輸送到sort。然后你使用sed來做相反的事情(通過移除' '來取消每行的裝飾)。
')將這些行重新連接在一起。
printf "hello" | sed 's/(.)/1
/g'|排序| sed '{:a N;s/>;ta}'
//;ta}'
ehllo
你可以使用幾種方法,但這個方法對shell友好,但行為需要GNU sed。
uj5u.com熱心網友回復:
這在gawk中更容易實作,它包括對陣列進行排序的asort函式:
awk 'BEGIN{FS=OFS=ORS=""}{split($0,a);asort(a);for(i in a)print a[i]}'/span><;<;<;hello
這樣的輸出:
ehllo
uj5u.com熱心網友回復:
你需要寫一個函式來對一個單詞中的字母進行排序(見:https://www.gnu.org/software/gawk/manual/html_node/Join-Function.html):
function siw(word, result, arr, arrlen, arridx) {
split(word, arr, ""/span>)
arrlen = asort(arr)
for (arridx = 1; arridx <= arrlen; arridx ) {
結果 = 結果 arr[arridx]
}
return result
}
并定義一個排序子函式來比較兩個詞(見:https://www.gnu.org/software/gawk/manual/html_node/Array-Sorting-Functions.html):
function compare_by_letters(i1, v1, i2, v2, left, right) {
左 = siw(v1)
右 = siw(v2)
if (left < right)
return -1
else if (left == right)
return 0
else (left == right)
return 1
}
并將此函式與awk排序函式一起使用:
asort(array_test, array_test_result, "compare_by_letters")
然后,示例程式是:
function siw(word, result, arr, arrlen, arridx) {
結果 = hash_word[word]
if (result != ""/span>) {
return result
}
split(word, arr, "")
arrlen = asort(arr)
for (arridx = 1; arridx <= arrlen; arridx ) {
結果 = 結果 arr[arridx]
}
hash_word[word] = result
return result
}
function compare_by_letters(i1, v1, i2, v2, left, right) {
左 = siw(v1)
右 = siw(v2)
if (left < right)
return -1
else if (left == right)
return 0
else (left == right)
return 1
}
{
array_test[i ] = $0 {
}
END {
alen = asort(array_test, array_test_result, "compare_by_letters"/span>)
for (aind = 1; aind <= alen; aind ) {
print array_test_result[aind] 。
}
}
像這樣執行:
echo -e "失敗
誕生
生"| awk -f sort_letter.awk
輸出:
fail
生
???
當然,如果你有一個大的輸入,你可以調整siw函式來記憶結果,以獲得最快的計算:
function siw(word, result, arr, arrlen, arridx){
結果 = hash_word[word]
if (result != ""/span>) {
return result
}
split(word, arr, "")
arrlen = asort(arr)
for (arridx = 1; arridx <= arrlen; arridx ) {
結果 = 結果 arr[arridx]
}
hash_word[word] = result
return result
}
轉載請註明出處,本文鏈接:https://www.uj5u.com/gongcheng/308020.html
標籤:
