我需要处理一个由以下记录组成的文件:
5145
Xibraltar: vista xeral do Peñón
1934, xaneiro, 1 a 1934, decembro, 31
-----FOT-5011--
Nota a data: extraída do listado de compra.
5146
Xixón: a praia de San Lorenzo desde o balneario
ca.1920-1930
-----FOT-3496--
5147
Xixón: balneario e praia de San Lorenzo
ca.1920-1930
Tipos de unidades de instalación: FOT:FOT
-----FOT-3493--
我需要删除1到4位数的记录号(即:5145)以及任何注释,例如“Nota a data:extraídadolistado de compra”,这些记录总是在记录结束后,签名后( - ---- FOT-xxxx--)和下一个记录的记录号之前。
我一直在尝试编写一个awk程序来执行此操作,但我似乎根本无法掌握awk的语法或正则表达式。
这是我尝试匹配记录号码,这些号码仅包含1到4位数字。 (我想我错过了“唯一”部分)。
$ gawk '!/[[:digit:]]{1,4}/ { print $0 }' myUTF8file.txt
另外,我可以匹配这些(记录签名):
$ gawk '/-----FOT-[[:digit:]]{4}--/ { print $0 }' myUTF8file.txt
-----FOT-3411--
-----FOT-3406--
-----FOT-3397--
-----FOT-3412--
...
但我不知道如何删除这些和记录号之间的行。
请原谅我的英语和我重复使用的单词记录,我知道这可能会让人感到困惑。
答案 0 :(得分:2)
一个小状态机:
awk '
p {print}
/^[[:digit:]]{4}$/ {p=1}
/^-----FOT-[[:digit:]]{4}--$/ {p=0}
' file
p
变量为真时打印一行:在看到4位数行后打开打印,看到" FOT"线。
答案 1 :(得分:1)
如果音符行始终以字符串" Nota" (并没有其他行开始)然后这将有效。
awk '
/^[0-9]{1,4}$/ {next}
/^Nota / {next}
1
' file
你的正则表达式有两种错误:
{1-4}
而不是{1,4}
上面awk脚本中的1
是一个始终为true的模式,因此它会导致执行默认操作(打印记录)。