Chinaunix

标题: 文本处理 [打印本页]

作者: zhuifeng_wsd    时间: 2015-05-07 10:03
标题: 文本处理
aa
bb
PATSET
11
22
33
44
55
66
LINKSET
cc
dd


如以上文本,希望处理成如下样子:
aa
bb
PATSET
11
LINKSET
cc
dd


关键字:PATSET,LINKSET,PATSET下一行(内容未必是11)

请大神出手相助,多谢。

作者: jason680    时间: 2015-05-07 10:14
本帖最后由 jason680 于 2015-05-07 10:17 编辑

回复 1# zhuifeng_wsd

$ awk '/LINKSET/{P=0}!P{print}/PATSET/{P=1;getline;print}' FILE
aa
bb
PATSET
11
LINKSET
cc
dd

   
作者: ppjer    时间: 2015-05-07 10:23
回复 2# jason680

这思路不太懂,awk高级用法。
awk 也用的很长时间了,也看了很资料,但一直徘徊在初级使用,对于awk高级(awk编程)使用,一直无法真正掌握。
作者: zhuifeng_wsd    时间: 2015-05-07 10:25
回复 2# jason680


    我也看不太懂,能简单讲解下就更好了。
作者: zsszss0000    时间: 2015-05-07 10:27
本帖最后由 zsszss0000 于 2015-05-07 10:28 编辑

思路就是遇到PASTE则打印改行和下一行后,马上禁止打印,知道遇到LINKSET后再打印
  1. awk 'BEGIN{p=1}/PATSET/{print ;getline s;print s;p=0}/LINKSET/{p=1}p' file
复制代码

作者: zxy877298415    时间: 2015-05-07 10:27
  1. awk '/[0-9]+/&&p==0 {p=1;print}/[a-zA-Z]+/{print}' file
复制代码
回复 1# zhuifeng_wsd


   
作者: jason680    时间: 2015-05-07 10:29
回复 3# ppjer

参看下列 基本所在

awk初学之常见问题
http://bbs.chinaunix.net/thread-2309494-1-1.html

   
作者: jason680    时间: 2015-05-07 10:36
回复 4# zhuifeng_wsd

CU多年 未习基础 可惜之处

参看下列 基本所在

awk初学之常见问题
http://bbs.chinaunix.net/thread-2309494-1-1.html
   

shell基础二十篇
http://bbs.chinaunix.net/thread-452942-1-1.html

shell 十三問:
http://bbs.chinaunix.net/thread-218853-1-1.html

作者: ppjer    时间: 2015-05-07 10:45
回复 8# jason680

awk 相关精华贴子基本都看过,大部分讲的基础应用,很少有涉及到这种高级编程的。

shell二十往篇有些文章看过多次。

shell 十三问看过2遍。

以上内容也都实践过,但就是无法达到awk高级编程的程度,总感觉缺少很多思路。
作者: 日复一日王    时间: 2015-05-07 10:57
回复 2# jason680


    这个同志好厉害拉,什么都会拉
作者: jason680    时间: 2015-05-07 10:57
本帖最后由 jason680 于 2015-05-07 11:04 编辑

回复 9# ppjer

awk '/LINKSET/{P=0}!P{print}/PATSET/{P=1;getline;print}' FILE
试问 何处高级 ?


http://bbs.chinaunix.net/thread-2309494-1-1.html
    1. awk ‘{code}1’ 中的“1”是干什么的?
一个完整的awk语句为:Awk ‘[patten]{action}……’, 其中pattern缺省为1,action缺省为{print}。
那么awk ‘1’完整的写法就是awk ‘1{print}’; 同理,awk ‘{print}’完整的写法也是awk ‘1{print}’。


    awk '/LINKSET/{P=0}!P{print}/PATSET/{P=1;getline;print}' FILE
    awk '
       /LINKSET/{P=0}
       !P{print}
       /PATSET/{P=1;getline;print}
    ' FILE

pattern and action 何来高级之有

注:思路则需训练与积累...


作者: zhuifeng_wsd    时间: 2015-05-07 11:03
回复 5# zsszss0000


   多谢,看明白了。二楼的写法我怎么看不明白呢?
作者: zhuifeng_wsd    时间: 2015-05-07 11:06
回复 11# jason680


    大神,有一处不明,这个P的初始值是多少?在PATSET前的文本处理,是怎么执行的?
作者: jason680    时间: 2015-05-07 11:13
本帖最后由 jason680 于 2015-05-07 11:38 编辑

回复 13# zhuifeng_wsd

P初值为""(空值)
!P{print}

注: awk 变量初值均为""(空值)

参看(同思路...)
http://bbs.chinaunix.net/thread-2309494-1-1.html
10. awk ‘! a[$0]++’ 怎么理解?
   
作者: Windows19    时间: 2015-05-07 11:38
你们到底是什么毕业的,这么厉害
作者: zhuifeng_wsd    时间: 2015-05-07 12:58
哪位大神能用sed给写一个,学习一下
作者: jason680    时间: 2015-05-07 13:12
回复 16# zhuifeng_wsd

筷子喝汤?
   
作者: zhuifeng_wsd    时间: 2015-05-07 13:14
回复 17# jason680


    你的意思是sed不适合?
作者: klainogn    时间: 2015-05-07 13:31
  1. sed -rn ':1;$!{N;b1};s/(PATSET\n[^\n]+).*(LINKSET)/\1\n\2/gp'  urfile
  2. aa
  3. bb
  4. PATSET
  5. 11
  6. LINKSET
  7. cc
  8. dd
复制代码

作者: zhuifeng_wsd    时间: 2015-05-07 14:02
回复 19# klainogn


    学习了,高手
作者: ppjer    时间: 2015-05-07 14:12
回复 11# jason680

嗯,在处理很文档的时候就缺少思路。
作者: jason680    时间: 2015-05-07 14:51
本帖最后由 jason680 于 2015-05-07 16:24 编辑

回复 21# ppjer

思路是要训练的

说说看到什么
不会的又在那?
(思路在那卡住?)
   

>> awk 相关精华贴子基本都看过,....

看过无用 看懂是道
懂者不必然 要看
看者不必然 会懂
作者: liion631818    时间: 2015-05-07 15:30
回复 1# zhuifeng_wsd
  1. sed  -n '/PATSET/{N;p;:a;/LINKSET/bx;n;ba};:x;p'
复制代码

作者: dyshowgood    时间: 2015-05-07 16:50
平时留意下awk用法,用过就保存起来,慢慢积攒,到后来自然触类旁通,手到擒来了
作者: Shell_HAT    时间: 2015-05-07 16:57
回复 9# ppjer


O’Reilly sed & awk 2nd Edition 英文版
http://bbs.chinaunix.net/viewthread.php?tid=1588614#pid11286082

O’Reilly sed & awk 2nd Edition 中文高清修订第3版
http://bbs.chinaunix.net/thread-1743038-1-1.html

上午看教程,下午来论坛用awk帮别人解决问题,坚持一个月吧先。
作者: ppjer    时间: 2015-05-07 23:20
回复 25# Shell_HAT

嗯,awk资料收集了不少。
作者: songyc_2015    时间: 2015-05-08 01:06
回复 1# zhuifeng_wsd
  1. sed -n '0,/PATSET/p;/PATSET/{n;p;d};/LINKSET/,$p' e.txt
复制代码

作者: ppjer    时间: 2015-05-08 14:36
回复 22# jason680


    awk '/LINKSET/!p{print}/PATSET/{p=1;getline;print}'

p=1;getline;print,, 这个p启啥作用, 试了下只要非0,都可以。
作者: jason680    时间: 2015-05-08 16:21
本帖最后由 jason680 于 2015-05-08 18:15 编辑

回复 28# ppjer

参看11楼及14楼
   
若要思路训练
你必须详实写出想法及为什么你认为有问题之处...
不是单单写二三句,就能训练/积累思路...
懂与不懂之处均须详实写出

另外一提,每一个细节都很重要......
28楼少一个action...
作者: Herowinter    时间: 2015-05-08 18:24
回复 1# zhuifeng_wsd
  1. sed -n '/PATSET/{N;h;:1;n;/LINKSET/!b1;H;g};p' i
  2. aa
  3. bb
  4. PATSET
  5. 11
  6. LINKSET
  7. cc
  8. dd
复制代码

作者: dengwei29    时间: 2015-05-09 14:41
  1. sed '/PATSET/,/LINKSET/{//!d;n}' file.txt
复制代码

作者: zl624867243    时间: 2015-05-10 18:35
  1. sed '5,9d' file
复制代码

作者: zhuifeng_wsd    时间: 2015-05-11 11:14
回复 31# dengwei29


    这个写法好精炼,能否讲解一下?多谢
作者: Shell_HAT    时间: 2015-05-11 11:48
回复 33# zhuifeng_wsd


如果对sed的执行流程不清楚,用sedsed看看执行过程就懂了:
  1. ./sedsed -d --hide=hold '/PATSET/,/LINKSET/{//!d;n}' file.txt
复制代码
http://sedsed.sourceforge.net/
作者: ywmkelly    时间: 2015-05-11 14:18
Shell_HAT 发表于 2015-05-11 11:48
回复 33# zhuifeng_wsd

遇到大天朝局域网就想砸电脑!
作者: ywmkelly    时间: 2015-05-11 14:19
为何不能引用34楼,跑到33去了
作者: songyc_2015    时间: 2015-05-11 14:25
回复 31# dengwei29

学习了,//!d用的很巧妙。。。
作者: 651260546    时间: 2015-05-11 14:36
grep -v [22-66] 你要处理的文件
作者: zhuifeng_wsd    时间: 2015-05-11 14:38
回复 37# songyc_2015


    我还是不太明白,高手给讲讲
作者: zhuifeng_wsd    时间: 2015-05-11 14:46
回复 34# Shell_HAT


   执行结果好像PATSET,11都没打印出来啊
作者: Herowinter    时间: 2015-05-11 15:51
回复 40# zhuifeng_wsd

sed版本比较低的话可能不支持//!d,我这边执行结果是对的.
   
作者: Shell_HAT    时间: 2015-05-11 15:59
回复 40# zhuifeng_wsd


是的。这个是已知的bug,作者还没有修复。
https://github.com/aureliojargas/sedsed/issues/15
作者: 聆雨淋夜    时间: 2015-05-11 16:25
回复 19# klainogn
在这里,  “.*”是怎么匹配到\n,       以前我以为“.”匹配不到\r\n,请赐教。


   
作者: ywmkelly    时间: 2015-05-12 09:18
回复 34# Shell_HAT
  1. [root@localhost TEST]# ./sedsed -d --hide=hold '/PATSET/,/LINKSET/{//!d;n}' file.txt
  2. PATT:aa$
  3. COMM:/PATSET/,/LINKSET/ {
  4. PATT:aa$
  5. aa
  6. PATT:bb$
  7. COMM:/PATSET/,/LINKSET/ {
  8. PATT:bb$
  9. bb
  10. PATT:PATSET$
  11. COMM:/PATSET/,/LINKSET/ {
  12. COMM:// !d
  13. PATT:11$
  14. COMM:/PATSET/,/LINKSET/ {
  15. COMM:// !d
  16. PATT:22$
  17. COMM:/PATSET/,/LINKSET/ {
  18. COMM:// !d
  19. PATT:33$
  20. COMM:/PATSET/,/LINKSET/ {
  21. COMM:// !d
  22. PATT:44$
  23. COMM:/PATSET/,/LINKSET/ {
  24. COMM:// !d
  25. PATT:55$
  26. COMM:/PATSET/,/LINKSET/ {
  27. COMM:// !d
  28. PATT:66$
  29. COMM:/PATSET/,/LINKSET/ {
  30. COMM:// !d
  31. PATT:LINKSET$
  32. COMM:/PATSET/,/LINKSET/ {
  33. COMM:// !d
  34. PATT:LINKSET$
  35. COMM:n
  36. LINKSET
  37. PATT:cc$
  38. COMM:}
  39. PATT:cc$
  40. cc
  41. PATT:dd$
  42. COMM:/PATSET/,/LINKSET/ {
  43. PATT:dd$
  44. dd
  45. [root@localhost TEST]#
复制代码
这个处理结果解释正确吗?
作者: zhuifeng_wsd    时间: 2015-05-12 09:25
回复 44# ywmkelly


    我的执行结果也是这个,好像PATSET和11没有打印出来
作者: Shell_HAT    时间: 2015-05-12 09:59
回复 44# ywmkelly


    不正确。因为sedsed对 // last matched pattern 的处理有bug,作者还没有解决这个问题。
作者: maple412    时间: 2015-05-12 11:49
用p这个变量来控制打印,遇到PATSET 则打印本行和下一行,同时将P置为1,p=1的时候其他情况不打印,直到遇到LINKSET再将P置为0然后继续打印
BEGIN{
p=0
}
/PATSET/{
        print
        getline
        print
        p=1
}
!p{
print
}
/LINKSET/{
        print
        p=0
}
作者: dengwei29    时间: 2015-05-12 12:12
本帖最后由 dengwei29 于 2015-05-12 12:16 编辑

回复 33# zhuifeng_wsd

{...}中的//表示上一个匹配模式,可以把命令改写下面这样。。。再用sedsed就能很容易理解了
  1. sed '/PATSET/,/LINKSET/{/PATSET\|LINKSET/!d;n}' file
复制代码

作者: zhuifeng_wsd    时间: 2015-05-12 12:18
回复 48# dengwei29


   终于明白了,非常感谢您的热心解答。
作者: ywmkelly    时间: 2015-05-13 17:23
dengwei29
http://bbs.chinaunix.net/forum.p ... ;extra=#pid24404508
作者: stupid_lee    时间: 2015-05-14 09:59
zsszss0000 发表于 2015-05-07 10:27
思路就是遇到PASTE则打印改行和下一行后,马上禁止打印,知道遇到LINKSET后再打印


鲲鹏大神 解释的太好了,getline之前一直没重视,jason大神的代码我刚开始也没理解
作者: stupid_lee    时间: 2015-05-14 10:20
本帖最后由 stupid_lee 于 2015-05-14 10:21 编辑

回复 2# jason680
jsson大神,能否解释下!P{print} 为何要放在/LINKSET/{P=0}的后面,我的理解!P{print}是对每一行的操作嘛,这个放到前后应该都没有问题,为什么放到后面的时候PATSET不打印了

awk '/LINKSET/{P=0}!P{print}/PATSET/{P=1;getline;print}'  FILE

aa
bb
PATSET
11
LINKSET
cc
dd

awk '/LINKSET/{P=0}/PATSET/{getline;print;P=1}!P{print}'  FILE
aa
bb
11
LINKSET
cc
dd

作者: jason680    时间: 2015-05-14 10:55
本帖最后由 jason680 于 2015-05-14 10:56 编辑

回复 52# stupid_lee

>>能否解释下! ... ,我的理解!P{print}是对每一行的操作嘛,这个放到前后应该都没有问题...

1. 你前面问LINKSET,后面写PATSET ?

2. 放到前后应该都没有问题 ?
你等公交车
车(先)来,你(后)等(车走,你等)
你(先)等,车(后)来(上车,开走)
你说有没有问题/差别?  

http://bbs.chinaunix.net/thread-2309494-1-1.html
作者: klainogn    时间: 2015-05-22 18:49
本帖最后由 klainogn 于 2015-05-22 18:52 编辑

回复 43# 聆雨淋夜
.并不是匹配不到\r\n而是要看你的PATTERN SPACE里有没有\r\n;
因为大部分情况下PATTERN SPACE都只有一行,而且没有换行,只有用N、G、g、x等命令时,PATTERN SPACE里才可能有多行文本了,
当然你也可以用s对当前的PATTERN SPACE中加一些换行符,这时的 . 就可以匹配到换行了;
HOLD SPACE里默认是有一个换行的。


   




欢迎光临 Chinaunix (http://bbs.chinaunix.net/) Powered by Discuz! X3.2