標(biāo)題: 文本處理,awk or sed [打印本頁(yè)] 作者: 莫俠007 時(shí)間: 2014-11-17 18:07 標(biāo)題: 文本處理,awk or sed 原文如下:
[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的行,的下一行含有||的去掉||合成一行,生成另一個(gè)
文件; 即新文件應(yīng)該如下:
[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; 作者: zxy877298415 時(shí)間: 2014-11-17 18:56 回復(fù) 1# 莫俠007
awk '{if($0~/^\[/) {if (NR>1) print "";printf gensub(/[|]/,"","g",$0)} else if($0~/^\|/) {printf gensub(/[|]/,"","g",$0)}}END{print ""}' FILE
$ awk '/^\[/{printf N $0;N="\n"}sub(/^\|\|/,""){printf $0}END{print""}' FILE
[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;
作者: chengchow 時(shí)間: 2014-11-18 09:02
[root@pmaster tmp]# sed -r '1h;1!H;$!d;${g;s/\n\|\|//g}' 1
[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!.
復(fù)制代碼
作者: yestreenstars 時(shí)間: 2014-11-18 09:10
sed -n '/B0099S05/!b;:1;N;s/\n|/|/;t1;P;D'
復(fù)制代碼
作者: 圣西羅門柱 時(shí)間: 2014-11-18 11:17
root@ubuntu:/app/shell# sed -r '/B0099S05/{:1;N;s/\n\|\|//g;b1}' i
[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;
謝謝!sed的寫法,可讀性不容易懂。
注:這個(gè)寫法 看得我好頭疼啊,終于看明白了。
1h是把第一行當(dāng)前模式空間中內(nèi)容覆蓋至保持空間,1!H是將當(dāng)前模式空間中除了第一行的內(nèi)容追加至保持空間,
$!d是除了最后一行,其他行都刪除,g是將當(dāng)前保持空間中內(nèi)容覆蓋至模式空間,s/\n\|\|//g就是替換了。
sed每讀入一行,都進(jìn)行'1h;1!H;$!d;${g;s/\n\|\|//g}'的操作,所以讀入最后一行時(shí),相當(dāng)于把整個(gè)文件的內(nèi)容當(dāng)行一行來(lái)保存在保持空間中(其中包含多個(gè)\n),所
以$!d是必需的。
比如一文件:
a
b
c
d
此時(shí)保持空間的內(nèi)容為:(共四行)
a
a\nb
a\nb\nc
a\nb\nc\nd
$!d;后就只剩下a\nb\nc\nd了。