awk を使用して同じ長さの文字列を再グループ化する方法

awk を使用して同じ長さの文字列を再グループ化する方法

次のような文字列の長いリストがあります。

_ah_
_asn_
_ai_
_errr_
_an_

そして私はこれをこのように変換したいのです

"_ah_ai_an_",
"_asn_",
"_errr_"

私が試してみました :

cat file | awk '{ print length, $0 }' | sort -n -s | cut -d" " -f2-

","これは基本的に長さで並べ替えますが、私がやろうとしているのは、同じ長さのものをAs区切り文字で同じ行に配置することです。

答え1

$ cat tst.awk
{
    lgth = length($0)
    sub(/_$/,"",strs[lgth])
    strs[lgth] = strs[lgth] $0
}
END {
    for (lgth in strs) {
        printf "%s\"%s\"", sep, strs[lgth]
        sep = "," ORS
    }
    print ""
}

$ awk -f tst.awk file
"_ah_ai_an_",
"_asn_",
"_errr_"

答え2

これにより、必要な出力が得られます。

awk -F_ '
    {strr[length] = strr[length]"_"$2}
    length > max {max=length}
    END {
        for (i=1;i<max;i++) {if (strr[i]) print "\"" strr[i]"_\","}
        print "\"" strr[max]"_\""
    }' file

長さの行は、先頭に がi付き、 に追加されます。最後に、既存の要素をループし、が付かない最後の要素を除いてで出力します。strr[i]_strr"<element>_",,

関連情報