我的输入文件具有如下块。请帮我删除块和用awk或sed的linux | awk | shell脚本块删除
[abc]
para1=123
para2=456
para3=111
[pqr]
para1=333
para2=765
para3=1345
[xyz]
para1=888
para2=236
para3=964
现在它的内容如何删除块及其参数完全。请帮我AWK command.Thanks实现这一目标提前
我的输入文件具有如下块。请帮我删除块和用awk或sed的linux | awk | shell脚本块删除
[abc]
para1=123
para2=456
para3=111
[pqr]
para1=333
para2=765
para3=1345
[xyz]
para1=888
para2=236
para3=964
现在它的内容如何删除块及其参数完全。请帮我AWK command.Thanks实现这一目标提前
Perl的解决方案,不会自动删除块[abc]
perl -lne 'BEGIN{$/=""} print "$_\n" unless /^\[abc\]/' file
-n
环围绕输入文件的每一行,放于$ _变量的行,打印该行
-l
在处理之前删除换行符,并把它们放回之后
-e
执行Perl代码
$/
是输入记录分隔符。在BEGIN{}
块中将其设置为""
将使Perl进入段落模式。
$_
是当前行。
/^/
是正则表达式,其与所述搜索项开始
输出:
[pqr]
para1=333
para2=765
para3=1345
[xyz]
para1=888
para2=236
para3=964
这种变化使参数与-s
和遍[ABC]解析来可变$b
perl -slne 'BEGIN{$/=""} print "$_\n" unless /^$b/' -- -b='\[abc\]'
你可以使用RS
的分裂块,(注:NR>1
因为AWK生成开头空块)
awk -vRS='[' -v remove="pqr" '
NR>1 && $0 !~ "^"remove"]" {printf "%s", "["$0; }
' file
你,
[abc] para1=123 para2=456 para3=111 [xyz] para1=888 para2=236 para3=964
我提出了一个稍微不同的解决方案,只使用shell。
#!/bin/sh
# specify the block to withhold
WITHHOLD=2
COUNT=1
INAWHITESP=0
while read i
do if [ -z "$i" -a "$INAWHITESP" -eq 0 ]
then COUNT=$((COUNT + 1))
INAWHITESP=1
fi
if [ -n "$i" -a "$INAWHITESP" -eq 1 ]
then INAWHITESP=0
fi
if [ "$COUNT" -ne "$WITHHOLD" ]
then printf "%s\n" "$i"
fi
done <inputfile> outputfile
取决于您想要如何过滤。如果要删除与所述报头中的块 '[PQR]'
awk '!/^\[pqr\]/' RS= ORS='\n\n' input
或
awk '$1 !~ "[pqr]"' RS= ORS='\n\n' input
如果你想省略第二记录(与上述相同)
awk 'NR!=2' RS= ORS='\n\n' input
如果要省略para2 = 765的记录,则可以使用
awk '$3 !~ "765"' RS= ORS='\n\n' input
要删除块abc
awk 'BEGIN{RS=""} !/\[abc\]/'
好主意。你可以简化:'awk -F']'-v RS ='['-v ORS ='['-v remove ='pqr''$ 1!= remove'',加上一个步骤来整理杂散ORS在输出结束 –
我喜欢你的解决方案,更好.... –
嗨,感谢您的想法,但是,但是这并不工作好,当我有像块 [abc] 块的输入1 = [run ] 2 = [停止] 请帮助我一样的命令 –