簡體   English   中英

AWK字符串按字母順序比較

[英]AWK string comparison by alphabetical order

問題很簡單。 我有一個AWK腳本,並且有兩個字符串(名稱)。 如果它們的長度相同,那么我需要根據ASCII選擇 aplhabet中較早的長度

第一個例子:

 1st string = "aac", 2nd string = "aab"

結果: aab

第二個例子:

1st string = "Donald J Cat", 2nd string = "Donald J Bat"

結果: Donald J Bat

有一種簡單的方法可以在AWK中進行嗎?

使用awk:

if ("aab" < "aac") {print "aab is sooner"}

假設比較的字段是第一和第二,打印較短的字段,或者根據詞法順序(又稱字典順序)打印相等的長度

awk '...
     len1=length($1); len2=length($2);
     f = len1<len2 || (len1==len2 && $1<$2);
     print f?$1:$2; ...'

如果要區分大小寫更改為tolower($1)<tolower($2)

如果僅處理兩個字符串,則可以將awk的行為與字符串比較和三元數一起使用,以您描述的順序將兩個字符串分配給單個字符串:

$ echo "aac,aab
Donald J Cat,Donald J Bat
zoom batman,ahem Mr President
zzzzzz,a
aa,z" | awk -F, '{s=$1<$2 ? $1 "," $2 : $2 "," $1; print s}'
aab,aac
Donald J Bat,Donald J Cat
ahem Mr President,zoom batman
a,zzzzzz
aa,z

這將按照升序打印兩個單詞; 一個a跳動的滿手zzzz

如果要對多個字符串進行排序,並且最近使用了gawk vs POSIX awk,則可以使用PROCINFO遍歷按值排序的數組:

echo "aac,aab,Donald J Cat,Donald J Bat
zoom batman,ahem Mr President,zzzzzz,a,aa,zz" | awk -F, '{s="";split("",a);
                                                    for (i=1;i<=NF;i++) a[i]=$i
                                                    PROCINFO["sorted_in"] = "@val_num_asc"
                                                    for (e in a) s=s a[e] ","
                                                    print gensub(",$","","1",s)}'
Donald J Bat,Donald J Cat,aab,aac
a,aa,ahem Mr President,zoom batman,zz,zzzzzz

注意,在升序排序中, 'D'<'a' 在gawk中,可以根據需要輕松編寫自定義比較函數。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM