我有这个转换后的字典可以在纯数据中使用。它由一系列三件事组成:单词、发音以及结束的分号。在转换后的字典中,缺少一些分号,因此我希望 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
这不是很好的工作。
或者我指向的是错误的方向。
使用
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
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
;