使用 linux 命令对第二列进行排序

sha*_*nuo 1 awk grep sed

是否可以水平排序文本?例如,我有这个 hunspell 文件,其中包含所有英文单词,后跟标签。(它可能包含 unicode 文本和数百万个单词)

test/BACac
this/QPR
line/MNP
again/Xx
Run Code Online (Sandbox Code Playgroud)

我需要对标签进行排序(最好是:先小写,然后大写) 预期:

test/acABC
this/PQR
line/MNP
again/xX
Run Code Online (Sandbox Code Playgroud)

我可以在熊猫中做到这一点。但我想知道我是否可以仅使用 linux 命令完成任务!

import pandas as pd
df = pd.read_csv('test.csv', sep='/', header=None)
df.columns = ['word', 'tags']
df['tags']=df['tags'].map(lambda x: ''.join(sorted([i for i in x])))
df['final'] = df['word'] + '/' + df['tags'] 
df['final'].to_csv('result.csv', index=False, header=None)
Run Code Online (Sandbox Code Playgroud)

Ed *_*ton 6

使用用于“sorted_in”的 GNU awk 并在指定空分隔符时将字符串拆分为字符:

$ cat tst.awk
BEGIN {
    FS=OFS="/"
    PROCINFO["sorted_in"] = "@val_str_asc"
}
{
    split($2,lets,"")
    $2 = ""
    for (i in lets) {
        $2 = $2 lets[i]
    }
    print
}
Run Code Online (Sandbox Code Playgroud)

$ awk -f tst.awk file
test/ABCac
this/PQR
line/MNP
again/Xx
Run Code Online (Sandbox Code Playgroud)

要获得小写字母在大写字母之前排序的输出,您必须找到具有这种排序规则的语言环境并LC_ALL=<that locale>在运行脚本之前进行设置,或者首先将所有大写字母转换为小写字母,反之亦然,然后进行排序,然后转换在打印之前将它们返回或通过在每个真实字符前面放置一个装饰符字符来做类似的事情,例如所有小写字母都获得前导,A而大写字母获得前导a以再次强制不同的顺序,例如:

$ cat tst.awk
BEGIN {
    FS=OFS="/"
    PROCINFO["sorted_in"] = "@val_str_asc"
}
{
    split($2,lets,"")

    for (i in lets) {
        lets[i] = ( lets[i] ~ /[[:lower:]]/ ? "A" : "a" ) lets[i]
    }

    $2 = ""
    for (i in lets) {
        $2 = $2 substr(lets[i],2)
    }    
    print
}
Run Code Online (Sandbox Code Playgroud)

$ awk -f tst.awk file
test/acABC
this/PQR
line/MNP
again/xX
Run Code Online (Sandbox Code Playgroud)