shell如何实现这种高难度的合成

ilovemayong 2005-02-18 03:29:36
shell如何实现这种高难度的合成

文件如下:
[2005/02/18 13:44:23 B0099S05] SELECT a,
|| b,
|| from dual;
[2005/02/18 13:44:23 B0099S05] UPDATE MATERIAL T
|| SET T.CDELDATE = '20050216'
[2005/02/18 13:44:23 B0099S05] DELETE * from MATERIAL;
aaaaaaaaaaa
bbbbbbbbbb
PL/SQL over!。

要求:
1:将文件中所有含有B0099S05的行,的下一行含有||的去掉||合成一行,生成另一个
文件; 即新文件应该如下:
[2005/02/18 13:44:23 B0099S05] SELECT a, b, from dual;
[2005/02/18 13:44:23 B0099S05] UPDATE MATERIAL T SET T.CDELDATE = '20050216'
[2005/02/18 13:44:23 B0099S05] DELETE * from MATERIAL;

请教大虾阿:
谢谢!
...全文
147 5 打赏 收藏 转发到动态 举报
写回复
用AI写文章
5 条回复
切换为时间正序
请发表友善的回复…
发表回复
gettext 2005-02-19
  • 打赏
  • 举报
回复
# cat file | sed -e :a -e '$!N;s/\n||/ /;ta' -e 'P;D'
sourceid 2005-02-19
  • 打赏
  • 举报
回复
写了个shell脚本.

#!/bin/sh
# runsql.sh

sed '/^[^\[\||]/d' rec.txt >out1.txt

while read LINE
do
case $LINE in
\[*) echo -n "$LINE" >>out2.txt
;;
\|*) echo -n "$LINE" >>out2.txt
;;
esac
done < out1.txt
sed 's/\[/\n\[/g' out2.txt | sed 's/\||//g' | sed -e '/^$/d' >out.txt
rm -f out1.txt out2.txt

wti 2005-02-18
  • 打赏
  • 举报
回复
有sed2perl or awk2perl,不知道有没有perl2awk 或是 perl2sed
warabi 2005-02-18
  • 打赏
  • 举报
回复
相同的做法,
用shell 的sed也应该能做出来。
可,那个俺不会。
warabi 2005-02-18
  • 打赏
  • 举报
回复
试试看,这个perl版的中不?

-------------------------
#!/usr/bin/perl

$src = $ARGV[0];
$dest = $ARGV[1];

open IN,$src;
open OUT,">$dest";
while(<IN>) {
s/(\r)?\n$//;
s/^\|\|//;
s/^\[/\n/; # Linux version
print OUT $_;
}
close OUT;
close IN;
-------------------------
思路:
1.去回车 2. 去 "||" 3. 加回车
用法:
另存为 conv.pl
$ perl conv.pl yourOrgFile yourOutputFile

最近比较闲,呵呵 ...

23,120

社区成员

发帖
与我相关
我的任务
社区描述
Linux/Unix社区 应用程序开发区
社区管理员
  • 应用程序开发区社区
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧