如何在文件中删除以括号开头和结尾的列
期望输入 - input.txt的内容
ABC (BCD) EFG
BCD (ABC) (BCD)
DEF BCD (ABC)
EFG HI(JKL)
ABC EFG (HI JK) LMN
期望输出 - output.txt的内容
ABC EFG
BCD
DEF BCD
EFG HI(JKL)
ABC EFG LMN
为了清晰起见,我只想再添加一个示例输入。
ABC (lll) INTEGER NOT NULL -3
EDG (FK) (lll) INTEGER NOT NULL -3
HIJ (nn ooo) CHAR(16) NOT NULL 'Not Provided'
KLM (ppp) VARCHAR(75) NOT NULL 'Not Provided'
NOP (qqq) VARCHAR(75) NOT NULL 'Not Provided'
QARD (rrr) DATE NOT NULL '1900-01-01'
QRS (sss) DATE NOT NULL '1900-01-01'
TUV DATE NOT NULL '1900-01-01'
WXY (uuu) CHAR(1) NOT NULL 'N'
答案 0 :(得分:2)
用法
awk '{print $0" "}' foo.txt | awk -f foo.awk
<强> foo.awk 强>
BEGIN {
RS=ORS=" "
}
{
n=length($0)
if (!n) next
split($0, s, "")
}
s[1]=="(" && s[n]==")" {
# it is column like (abcd), skip it
next
}
s[1]=="(" {
# stop printing
f=1
}
!f {
print $0
}
s[n]==")" {
# start printing again
f=0
}
答案 1 :(得分:1)
基于@slitvinov的解决方案:
BEGIN {
RS = "[[:space:]]"
ORS = ""
eat = 0
}
/^\(.*\)$/ {
next
}
/^\(/ {
eat = 1
next
}
/\)$/ {
if (eat) {
eat = 0
next
}
}
{
if (eat)
next
print $0 RT
}
对.awk
文件和awk -f foo.awk foo.txt
提供:
ABC EFG
BCD
DEF BCD
EFG HI(JKL)
ABC EFG LMN
但我认为可以做得更简单......
答案 2 :(得分:0)
我能组装的最简单的事情是:
perl -pe 'BEGIN { undef $<; } s/\s(\(.*?\)(\s))+/\2/cgs' foo.txt
对不起Perl,但是它在POSIX中,并且它具有足够强大的正则表达式来覆盖案例。
啊,如果文件以括号开头,则无法处理。如果它以一个结束,只要它后面有换行符就可以了。如果这是一个问题,那么最简单的解决方案就是添加一个临时空间。