AWK 用分号分隔大写字母和非大写字母的行(如果没有分号)

问题描述 投票:0回答:2

我有这个转换后的字典可以在纯数据中使用。它由一系列三件事组成:单词、发音以及结束的分号。在转换后的字典中,缺少一些分号,因此我希望 AWK 找到缺少的部分并为我添加分号。我以前使用过分隔符,但这对我来说很难,所以任何帮助将不胜感激。查看文本文件:前3个是好的,后3个是错误的,末尾少了一个分号。我认为 AWK 分隔符将位于非大写字母和大写字母之间,如果已经没有分号,则操作是添加分号。我如何将其放入 AWK 代码中?

ELFKIN
Elf
kin;
ELFLAND
Elf
land
;
ELFLOCK
Elf
lock
;
ELGIN
El
gin
ELICIT
E
lic
it
ELICIT
E
lic
it

我之前使用过一些分隔符,但我不知道如何在AWK中指定之间。 所以Delimiter是非大写字母和大写字母,并在那里放一个分号。 所以有些代码看起来像这样 awk 'length($0)>1 && 全部大写的行在此行之前放置分号' 或者 awk '非大写的行,如果下一行是大写,则在行后放置分号 我试过这个

awk 'length($0>1) && /[:^, upper:]/{l=l";"}NR>1{print l}{l=$0}END{print l}' file2

这不是很好的工作。

或者我指向的是错误的方向。

awk sed delimiter
2个回答
0
投票

使用

shell
sed
,正则表达式很容易理解,它们很基本:

echo $(< file) |
     sed -E 's/ *;? *\b([A-Z]{2,})\b/;\1/g; s/;//; s/ +/\n/g; s/;/\n;\n/g'

产量:

ELFKIN
Elf
kin
;
ELFLAND
Elf
land
;
ELFLOCK
Elf
lock
;
ELGIN
El
gin
;
ELICIT
E
lic
it
;
ELICIT
E
lic
it

0
投票
awk '
    {
        if ( /^[[:upper:]]{2,}$/ && needs_terminator )
            print ";"
        print
        needs_terminator = !/;/
    }
    END {
        if (needs_terminator)
            print ";"
    }
' file

根据您的数据,给出:

ELFKIN
Elf
kin;
ELFLAND
Elf
land
;
ELFLOCK
Elf
lock
;
ELGIN
El
gin
;
ELICIT
E
lic
it
;
ELICIT
E
lic
it
;
© www.soinside.com 2019 - 2024. All rights reserved.