亚洲av成人无遮挡网站在线观看,少妇性bbb搡bbb爽爽爽,亚洲av日韩精品久久久久久,兔费看少妇性l交大片免费,无码少妇一区二区三区

Chinaunix

標(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


   
作者: Herowinter    時(shí)間: 2014-11-17 19:05
回復(fù) 1# 莫俠007
  1. sed ':1;/B0099S05/{:2;N;s/\n||//;t2;b1}' i
  2. [2005/02/18 13:44:23 B0099S05] SELECT a, b, from dual;
  3. [2005/02/18 13:44:23 B0099S05] UPDATE MATERIAL T SET T.CDELDATE = '20050216'
  4. [2005/02/18 13:44:23 B0099S05] DELETE * from MATERIAL;
  5. aaaaaaaaaaa
  6. bbbbbbbbbb
  7. PL/SQL over!.
復(fù)制代碼

作者: jason680    時(shí)間: 2014-11-17 19:48
回復(fù) 1# 莫俠007

$ awk '/^\[/{printf N $0;N="\n"}/^\|\|/{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;
作者: 莫俠007    時(shí)間: 2014-11-17 20:26
@zxy877298415 @jason680 @Herowinter
awk的寫法都是匹配以^[ 開(kāi)頭就換行
而sed的寫法,看得不是那么直觀,我看看sed的高級(jí)用法先
作者: 莫俠007    時(shí)間: 2014-11-17 20:50
@Herowinter
http://www.groad.net/bbs/thread-6845-1-1.html
再一次謝謝你 看明白 你的寫法了
作者: fangang001    時(shí)間: 2014-11-17 22:07
回復(fù) 4# jason680

awk '/^\[/{printf N $0;N="\n"}/^\|\|/{printf $0}END{print""}'  china.data | sed -e 's/||//g'


   
作者: Herowinter    時(shí)間: 2014-11-17 22:59
回復(fù) 6# 莫俠007


這么快就能看明白,佩服,我剛學(xué)sed的時(shí)候這種代碼要想好久才能明白。
作者: jason680    時(shí)間: 2014-11-17 23:01
回復(fù) 7# fangang001

Thank you for your notice

$ 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
  1. [root@pmaster tmp]# sed -r '1h;1!H;$!d;${g;s/\n\|\|//g}' 1
  2. [2005/02/18 13:44:23 B0099S05] SELECT a, b, from dual;
  3. [2005/02/18 13:44:23 B0099S05] UPDATE MATERIAL T SET T.CDELDATE = '20050216'
  4. [2005/02/18 13:44:23 B0099S05] DELETE * from MATERIAL;
  5. aaaaaaaaaaa
  6. bbbbbbbbbb
  7. PL/SQL over!.
復(fù)制代碼

作者: yestreenstars    時(shí)間: 2014-11-18 09:10
  1. sed -n '/B0099S05/!b;:1;N;s/\n|/|/;t1;P;D'
復(fù)制代碼

作者: 圣西羅門柱    時(shí)間: 2014-11-18 11:17
  1. root@ubuntu:/app/shell# sed -r '/B0099S05/{:1;N;s/\n\|\|//g;b1}'  i
  2. [2005/02/18 13:44:23 B0099S05] SELECT a, b, from dual;
  3. [2005/02/18 13:44:23 B0099S05] UPDATE MATERIAL T SET T.CDELDATE = '20050216'
  4. [2005/02/18 13:44:23 B0099S05] DELETE * from MATERIAL;
  5. aaaaaaaaaaa
  6. bbbbbbbbbb
  7. PL/SQL over!。
復(fù)制代碼

作者: jcdiy0601    時(shí)間: 2014-11-18 13:12
本帖最后由 jcdiy0601 于 2014-11-18 13:12 編輯

回復(fù) 12# 圣西羅門柱


    能給我講講大括號(hào)里面的內(nèi)容什么意思嗎
作者: 圣西羅門柱    時(shí)間: 2014-11-18 14:41
回復(fù) 13# jcdiy0601


    b label ,無(wú)條件跳轉(zhuǎn)到標(biāo)簽label,如果label沒(méi)有指定,跳轉(zhuǎn)到命令的結(jié)尾
     
     http://www.72891.cn/forum.p ... mp;fromuid=26669282
     看看這個(gè)
作者: 莫俠007    時(shí)間: 2014-11-18 14:52
回復(fù) 10# chengchow

謝謝!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了。

   
作者: chengchow    時(shí)間: 2014-11-18 15:13
回復(fù) 15# 莫俠007
good!
$!d也不是必須有
sed -rn '....' 添加個(gè)-n參數(shù)關(guān)閉自動(dòng)模式空間打印功能也可以


   
作者: 莫俠007    時(shí)間: 2014-11-18 15:58
回復(fù) 16# chengchow
如果加了n,把保持空間的最后一行覆蓋到模式空間時(shí),也不會(huì)打印出模式空間的內(nèi)容的吧。


   
作者: chengchow    時(shí)間: 2014-11-18 16:03
回復(fù) 17# 莫俠007
可以+$p就可以了
寫法多樣,找自己習(xí)慣的


   
作者: 莫俠007    時(shí)間: 2014-11-18 16:05
回復(fù) 18# chengchow
是的,受教,學(xué)習(xí)了,通過(guò)這一貼對(duì)sed了解深了一些!


   
作者: jcdiy0601    時(shí)間: 2014-11-18 17:40
回復(fù) 14# 圣西羅門柱


    鏈接進(jìn)不去
作者: 莫俠007    時(shí)間: 2014-11-19 09:54
回復(fù) 18# chengchow
早上想到一個(gè)問(wèn)題$!d,會(huì)對(duì)保持空間的東西操作吧,但sed -r '1h;1!H;1,$d;${g;s/\n\|\|//g}' 1  這個(gè)不只是只刪除模式空間的東西么,
最后把保持空間的最后一行覆蓋到模式空間,我是這樣理解的,但結(jié)果是什么都沒(méi)有打印出來(lái)了


   
作者: 圣西羅門柱    時(shí)間: 2014-11-19 10:45
回復(fù) 20# jcdiy0601

:1;N;s/\n\|\|//g;b1
   
:1跳轉(zhuǎn)指向
N 讀取下一行
s/\n\|\|//g 替換\n ||為空
b1 跳轉(zhuǎn)到1
作者: 聆雨淋夜    時(shí)間: 2014-11-19 11:40
回復(fù) 4# jason680
我的寫法是:sed '/B0099S05/{:1;N;s/\n||//g;b1}' 1.txt
請(qǐng)教一下,我以為只會(huì)輸出第一行:[2005/02/18 13:44:23 B0099S05] SELECT a, b, from dual;
但是會(huì)輸出如下
[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!

   
作者: 聆雨淋夜    時(shí)間: 2014-11-19 11:44
回復(fù) 23# 聆雨淋夜
b1后面是; P

   
作者: reyleon    時(shí)間: 2014-11-19 12:07
  1. sed -n '/B0099S05/{:1;N;s/\n||/ /;t1;P;D}' file  
復(fù)制代碼

作者: jcdiy0601    時(shí)間: 2014-11-19 13:27
回復(fù) 22# 圣西羅門柱


    謝謝~~~




歡迎光臨 Chinaunix (http://www.72891.cn/) Powered by Discuz! X3.2