Bash 通过比较多个字符串查找并删除文件中的行

Bash 通过比较多个字符串查找并删除文件中的行,bash,macos,Bash,Macos,我有以下文件: SOME TEXT AT START OF FILE STRING1 SMALL STRING2 SMALL STRING1 MEDIUM STRING3 LARGE STRING2 XLG SOME TEXT TO SEPARATE LISTS STRING4 SMALL STRING1 MEDIUM STRING1 SMALL STRING5 LARGE STRING6 SMALL SOME MO

我有以下文件:

SOME TEXT AT START OF FILE
    STRING1 SMALL
    STRING2 SMALL
    STRING1 MEDIUM
    STRING3 LARGE
    STRING2 XLG
SOME TEXT TO SEPARATE LISTS
    STRING4 SMALL
    STRING1 MEDIUM
    STRING1 SMALL
    STRING5 LARGE
    STRING6 SMALL
SOME MORE TEXT TO SEPARATE LISTS
    ANOTHER LIST
...
对于每个列表,我只想保留每个字符串的最大值(S、M、L、XL),以便结果如下所示:

SOME TEXT AT START OF FILE
    STRING1 MEDIUM
    STRING3 LARGE
    STRING2 XLG
SOME TEXT TO SEPARATE LISTS
    STRING4 SMALL
    STRING1 MEDIUM
    STRING5 LARGE
    STRING6 SMALL
SOME MORE TEXT TO SEPARATE LISTS
    ANOTHER LIST
...
我不知道怎么做。请帮忙。我试图通过mac上的终端在bash脚本中实现这一点


我还需要修改另一个类似的列表

TEXT
    STRING1
    STRING2
    STRING3
    STRING1
TEXT
    STRING4
    STRING1
TEXT
    STRING5
    STRING2
    STRING5
ETC...

在这种情况下,如何消除重复字符串?我打算尝试使用
awk'!查看[$0]+'filename
,但是这将从每个列表中删除字符串,而不是单独查看每个列表。

关于第一个问题

$ cat tst.awk
BEGIN {
    sz["SMALL"]  = 0
    sz["MEDIUM"] = 1
    sz["LARGE"]  = 2
    sz["XLG"]    = 3
}

/^[^ ]/ {
    dump()
    delete data
    print
    next
}

!($1 in data) || sz[data[$1]] < sz[$2] {
    data[$1] = $2
}

END {
    dump()
}

function dump(k) {
    for (k in data)
        print "    " k " " data[k]
}
$
$ awk -f tst.awk file
SOME TEXT AT START OF FILE
    STRING1 MEDIUM
    STRING2 XLG
    STRING3 LARGE
SOME TEXT TO SEPARATE LISTS
    STRING4 SMALL
    STRING5 LARGE
    STRING6 SMALL
    STRING1 MEDIUM
SOME MORE TEXT TO SEPARATE LISTS
    ANOTHER LIST
...

谢谢你的回复。我试过了,一切都很好,除非字符串前面有空格。对不起,我被切断了编辑我最后的评论。。。。通常,带有STRINGN和SIZE的行将以一些额外的文本开始,这样字符串将以$6而不是$1结束,SIZE将以$7而不是$2结束。问题是当我在最后打印所有内容时,第一行打印不正确:一些文本查找更多文本字符串大小查找更多文本字符串大小请查看并相应编辑您的问题,以便我们提供帮助
awk '/^[^ ]/{delete seen}!seen[$0]++' file