Chinaunix

标题: 请教awk过滤行中空格或\t [打印本页]

作者: ccjsj1    时间: 2016-03-08 22:33
标题: 请教awk过滤行中空格或\t
本帖最后由 ccjsj1 于 2016-03-08 22:35 编辑

如下:将每3行按一行输出,做下对齐,但第6行和第9行是以空格或\t开头,用gsub过滤不掉--!
  1. neo@asterisk:/tmp$ cat 3.log
  2. STATUS
  3. ------------
  4. OPEN
  5. SESSION_ACTIVE
  6. --------------
  7.         30
  8. SESSION_CURCOUNT
  9. ----------------
  10.         463
  11. PROCESSES_ALLCOUNT
  12. ------------------
  13. 10000

  14. neo@asterisk:/tmp$ cat -A 3.log
  15. STATUS$
  16. ------------$
  17. OPEN$
  18. SESSION_ACTIVE$
  19. --------------$
  20. ^I30$
  21. SESSION_CURCOUNT$
  22. ----------------$
  23. ^I463$
  24. PROCESSES_ALLCOUNT$
  25. ------------------$
  26. 10000$

  27. neo@asterisk:/tmp$ cat 3.log | awk '{if($0~"STATUS") a=1; if(a!=3) {gsub(/\t/,""); printf("%-20s",$0); a++ } else {print $0; a=1}}'
  28. STATUS              ------------        OPEN
  29. SESSION_ACTIVE      --------------              30
  30. SESSION_CURCOUNT    ----------------            463
  31. PROCESSES_ALLCOUNT  ------------------  10000

  32. neo@asterisk:/tmp$ cat 3.log | awk '{if($0~"STATUS") a=1; if(a!=3) {gsub(/^ */,""); printf("%-20s",$0); a++ } else {print $0; a=1}}'
  33. STATUS              ------------        OPEN
  34. SESSION_ACTIVE      --------------              30
  35. SESSION_CURCOUNT    ----------------            463
  36. PROCESSES_ALLCOUNT  ------------------  10000

  37. neo@asterisk:/tmp$ cat 3.log | awk '{if($0~"STATUS") a=1; if(a!=3) {gsub(/^ */,""); printf("%-20s",$0); a++ } else {print $0; a=1}}' | cat -A
  38. STATUS              ------------        OPEN$
  39. SESSION_ACTIVE      --------------      ^I30$
  40. SESSION_CURCOUNT    ----------------    ^I463$
  41. PROCESSES_ALLCOUNT  ------------------  10000$
复制代码

作者: Herowinter    时间: 2016-03-08 23:18
回复 1# ccjsj1

  1. cat 3.log|xargs -n 3|column -t
  2. STATUS              ------------        OPEN
  3. SESSION_ACTIVE      --------------      30
  4. SESSION_CURCOUNT    ----------------    463
  5. PROCESSES_ALLCOUNT  ------------------  10000
复制代码

作者: ccjsj1    时间: 2016-03-09 08:54
回复 2# Herowinter

感谢这末快的回复!结果也是期望的 !还是想用awk来实现,不知有什末办法没有?谢谢!

   
作者: jcdiy0601    时间: 2016-03-09 09:35
  1. sed -e 's/^\s*//;N;N;s/\n/ /g' file |column -t
  2. STATUS              ------------        OPEN
  3. SESSION_ACTIVE      --------------      30
  4. SESSION_CURCOUNT    ----------------    463
  5. PROCESSES_ALLCOUNT  ------------------  10000
复制代码

作者: zxy877298415    时间: 2016-03-09 09:43
  1. awk '{if(NR%3==0) {print gensub(" ","","G",$0)} else {printf("%-20s",$0)}}' file
复制代码
回复 1# ccjsj1


   
作者: ccjsj1    时间: 2016-03-09 10:45
本帖最后由 ccjsj1 于 2016-03-09 10:45 编辑

回复 4# jcdiy0601
谢谢回复!结果是想要的 !sed一直没学明白 想用awk实现
作者: Herowinter    时间: 2016-03-09 10:45
回复 3# ccjsj1

首先回答你的疑问, 空格 \t不是没有成功替换, 而是你没有让awk对$0重新进行赋值($1=$1).
比较下这两段代码的输出就知道了.

  1. awk '{gsub(/^\s*/,"");print}' test
  2. STATUS
  3. ------------
  4. OPEN
  5. SESSION_ACTIVE
  6. --------------
  7. 30
  8. SESSION_CURCOUNT
  9. ----------------
  10.         463
  11. PROCESSES_ALLCOUNT
  12. ------------------
  13.         10000

  14. awk '{gsub(/^\s*/,"");$1=$1;print}' test
  15. STATUS
  16. ------------
  17. OPEN
  18. SESSION_ACTIVE
  19. --------------
  20. 30
  21. SESSION_CURCOUNT
  22. ----------------
  23. 463
  24. PROCESSES_ALLCOUNT
  25. ------------------
  26. 10000
复制代码
用awk结合column -t也可以, 非要拿掉column -t自己去负责对齐吧.

  1. awk '{s=s"\t"$1} NR%3==0{print s;s=""}' test|column -t
  2. STATUS              ------------        OPEN
  3. SESSION_ACTIVE      --------------      30
  4. SESSION_CURCOUNT    ----------------    463
  5. PROCESSES_ALLCOUNT  ------------------  10000
复制代码

作者: elu_ligao    时间: 2016-03-09 10:46
回复 1# ccjsj1
  1. 你那里有点问题, gsub放错地方了
  2. awk '{if($0~"STATUS") a=1; if(a!=3) {printf("%-20s",$0); a++ } else {gsub(/\t/,"");print $0; a=1}}'
复制代码

作者: ccjsj1    时间: 2016-03-09 11:33
回复 5# zxy877298415
试了下还是不行啊
  1. neo@asterisk:~/check_log/awk$ cat 3.log
  2. STATUS
  3. ------------
  4. OPEN
  5. SESSION_ACTIVE
  6. --------------
  7.         30
  8. SESSION_CURCOUNT
  9. ----------------
  10.         463
  11. PROCESSES_ALLCOUNT
  12. ------------------
  13. 10000
  14. neo@asterisk:~/check_log/awk$ awk '{if(NR%3==0) {print gensub(" ","","G",$0)} else {printf("%-20s",$0)}}' 3.log
  15. STATUS              ------------        OPEN
  16. SESSION_ACTIVE      --------------              30
  17. SESSION_CURCOUNT    ----------------            463
  18. PROCESSES_ALLCOUNT  ------------------  10000
  19. neo@asterisk:~/check_log/awk$ awk '{if(NR%3==0) {print gensub(" ","","G",$0)} else {printf("%-20s",$0)}}' 3.log | cat -A
  20. STATUS              ------------        OPEN$
  21. SESSION_ACTIVE      --------------      ^I30$
  22. SESSION_CURCOUNT    ----------------    ^I463$
  23. PROCESSES_ALLCOUNT  ------------------  10000$
  24. neo@asterisk:~/check_log/awk$
复制代码

作者: ccjsj1    时间: 2016-03-09 11:36
本帖最后由 ccjsj1 于 2016-03-09 11:47 编辑

回复 7# Herowinter
你好,非常感谢!

不用重新赋值也是可以的(这是$0的内容已经修改了吧),如下:
  1. neo@asterisk:~/check_log/awk$ awk '{gsub(/^\s*/,"");print $0}' 3.log
  2. STATUS
  3. ------------
  4. OPEN
  5. SESSION_ACTIVE
  6. --------------
  7. 30
  8. SESSION_CURCOUNT
  9. ----------------
  10. 463
  11. PROCESSES_ALLCOUNT
  12. ------------------
  13. 10000
  14. neo@asterisk:~/ch
复制代码

作者: ccjsj1    时间: 2016-03-09 11:51
回复 8# elu_ligao

多谢了,这个可以的!

将下面内容放到第二个if前面也可以,每行都替换下;
gsub(/\t/,""

   
作者: elu_ligao    时间: 2016-03-09 11:58
回复 11# ccjsj1


    嗯, 当然, 我看你的代码, 意思好像是3的倍数的行就gsub,else 里面才是3倍数所在行执行的操作
作者: blackold    时间: 2016-03-09 12:01
回复 7# Herowinter


    有没有弄错呢?
作者: blackold    时间: 2016-03-09 12:03
本帖最后由 blackold 于 2016-03-09 12:13 编辑

回复 9# ccjsj1


    不是不行,因为
  1. " "
复制代码
空白地方,人家用的是<tab>,而你用的是<space>。 肯定不行了。

你用/\t/ 或 /\s/ 代替 " " 试试:
  1. awk '{if(NR%3==0) {print gensub(/\t/,"","G",$0)} else {printf("%-20s",$0)}}' urfile
复制代码
  1. awk '{if(NR%3==0) {print gensub(/\s/,"","G",$0)} else {printf("%-20s",$0)}}' urfile
复制代码
或者
  1. awk 'NR%3{printf("%-20s",$0);next}{gsub(/\t/,"");}1' urfile
复制代码

作者: blackold    时间: 2016-03-09 12:08
回复 8# elu_ligao


    赞!
作者: ccjsj1    时间: 2016-03-09 12:37
回复 15# blackold
明白了,多谢黑哥!
这末多方法,越来越简练!!
作者: Herowinter    时间: 2016-03-09 13:17
回复 13# blackold

是我搞错了, 没有替换成功.

   
作者: jcdiy0601    时间: 2016-03-10 09:09
回复 6# ccjsj1


    我也是在学习,你的思路也很好
作者: baby_神    时间: 2016-03-19 23:52
又学到一个新的函数用法,这个在书上好像没见过,不错

回复 5# zxy877298415


   
作者: ccjsj1    时间: 2016-03-21 12:43
回复 19# 时时20160307
不错,又学了一招,谢谢!

   




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