免费注册 查看新帖 |

Chinaunix

  平台 论坛 博客 文库
最近访问板块 发新帖
查看: 2980 | 回复: 6
打印 上一主题 下一主题

[文本处理] 请问awk如何在不含有@的行指定位置加上chr [复制链接]

论坛徽章:
0
跳转到指定楼层
1 [收藏(0)] [报告]
发表于 2013-12-21 16:30 |只看该作者 |倒序浏览
本帖最后由 chenjiali1 于 2013-12-21 16:31 编辑

文本如下:
@SQ     SN:chr15        LN:102531392
15        LN:102531392
15        LN:102531392
@SQ     SN:chr12        LN:133851895
@SQ     SN:chr13        LN:115169878

我想输出这样的结果
@SQ     SN:chr15        LN:102531392
chr15        LN:102531392
chr15        LN:102531392
@SQ     SN:chr12        LN:133851895
@SQ     SN:chr13        LN:115169878

即含有@或者其它指定的特殊字符,如&,%等的行直接输出,不含有的在行首加上chr,请问awk和sed分别如何实现,谢谢大家!
另外,如果想在不含有@字符的第二列前加入chr,请问如何实现。
@SQ     SN:chr15        LN:102531392
15        chrLN:102531392
15        chrLN:102531392
@SQ     SN:chr12        LN:133851895
@SQ     SN:chr13        LN:115169878
这里我只截取了少数行,唯一分隔的标准就是含不含@,而且@也不一定在行首。要加chr的列如上所述不一定是第一列即行首。

论坛徽章:
32
处女座
日期:2013-11-20 23:41:20双子座
日期:2014-06-11 17:20:43戌狗
日期:2014-06-16 11:05:00处女座
日期:2014-07-22 17:30:47狮子座
日期:2014-07-28 15:38:17金牛座
日期:2014-08-05 16:34:01亥猪
日期:2014-08-18 13:34:25白羊座
日期:2014-09-02 15:03:55金牛座
日期:2014-11-10 10:23:58处女座
日期:2014-12-02 09:17:52程序设计版块每日发帖之星
日期:2015-06-16 22:20:002015亚冠之塔什干火车头
日期:2015-06-20 23:28:22
2 [报告]
发表于 2013-12-21 16:49 |只看该作者
第一个需求:
  1. [root@localhost ~]# sed '/[@&%]/b;s/^/chr/' i
  2. @SQ     SN:chr15        LN:102531392
  3. chr15        LN:102531392
  4. chr15        LN:102531392
  5. @SQ     SN:chr12        LN:133851895
  6. @SQ     SN:chr13        LN:115169878
  7. [root@localhost ~]#
复制代码
  1. [root@localhost ~]# awk '!/[@&%]/{$0="chr"$0}1' i
  2. @SQ     SN:chr15        LN:102531392
  3. chr15        LN:102531392
  4. chr15        LN:102531392
  5. @SQ     SN:chr12        LN:133851895
  6. @SQ     SN:chr13        LN:115169878
  7. [root@localhost ~]#
复制代码
第二个需求:
  1. [root@localhost ~]# awk -vOFS='\t' '!/[@&%]/{$2="chr"$2}1' i
  2. @SQ     SN:chr15        LN:102531392
  3. 15      chrLN:102531392
  4. 15      chrLN:102531392
  5. @SQ     SN:chr12        LN:133851895
  6. @SQ     SN:chr13        LN:115169878
  7. [root@localhost ~]#
复制代码
如果想实现指定任意列插入chr,可以用变量控制:
  1. [root@localhost ~]# awk -vt=1 -vOFS='\t' '!/[@&%]/{$t="chr"$t}1' i
  2. @SQ     SN:chr15        LN:102531392
  3. chr15   LN:102531392
  4. chr15   LN:102531392
  5. @SQ     SN:chr12        LN:133851895
  6. @SQ     SN:chr13        LN:115169878
  7. [root@localhost ~]# awk -vt=2 -vOFS='\t' '!/[@&%]/{$t="chr"$t}1' i
  8. @SQ     SN:chr15        LN:102531392
  9. 15      chrLN:102531392
  10. 15      chrLN:102531392
  11. @SQ     SN:chr12        LN:133851895
  12. @SQ     SN:chr13        LN:115169878
  13. [root@localhost ~]#
复制代码

论坛徽章:
0
3 [报告]
发表于 2013-12-21 16:59 |只看该作者
回复 2# yestreenstars


    awk的看懂了,sed的能解释下吗?谢谢啦。对sed非常不熟。

论坛徽章:
32
处女座
日期:2013-11-20 23:41:20双子座
日期:2014-06-11 17:20:43戌狗
日期:2014-06-16 11:05:00处女座
日期:2014-07-22 17:30:47狮子座
日期:2014-07-28 15:38:17金牛座
日期:2014-08-05 16:34:01亥猪
日期:2014-08-18 13:34:25白羊座
日期:2014-09-02 15:03:55金牛座
日期:2014-11-10 10:23:58处女座
日期:2014-12-02 09:17:52程序设计版块每日发帖之星
日期:2015-06-16 22:20:002015亚冠之塔什干火车头
日期:2015-06-20 23:28:22
4 [报告]
发表于 2013-12-21 17:06 |只看该作者
回复 3# chenjiali1
  1. sed '
  2. /[@&%]/b; #匹配到@、&或%就跳转到脚本的尾部
  3. s/^/chr/ #将行首替换为chr
  4. '
复制代码
       b label
              Branch to label; if label is omitted, branch to end of script.

整个脚本的意思就是当匹配到@、&或%时就不执行任何操作,直接打印,否则就替换行首为chr,然后打印。

   

论坛徽章:
0
5 [报告]
发表于 2013-12-21 17:10 |只看该作者
明白了,刚查了下资料,感觉sed比awk难懂多了,这种判断语句连个if都没有

论坛徽章:
1
2015年迎新春徽章
日期:2015-03-04 09:58:11
6 [报告]
发表于 2013-12-23 09:41 |只看该作者
回复 5# chenjiali1


星辰大大 用的就是if语句,sed 里面的 b函数和 t函数就是  if语句,需要好好理解

针对第一种需求 还可以这样
  1. [root@everIover ~]# sed '/^[^@]/s/^/chr/' ii
  2. @SQ     SN:chr15        LN:102531392
  3. chr15        LN:102531392
  4. chr15        LN:102531392
  5. @SQ     SN:chr12        LN:133851895
  6. @SQ     SN:chr13        LN:115169878
  7. [root@everIover ~]# cat ii
  8. @SQ     SN:chr15        LN:102531392
  9. 15        LN:102531392
  10. 15        LN:102531392
  11. @SQ     SN:chr12        LN:133851895
  12. @SQ     SN:chr13        LN:115169878
复制代码

论坛徽章:
5
未羊
日期:2014-08-04 16:15:21天秤座
日期:2014-08-13 13:52:372015年辞旧岁徽章
日期:2015-03-03 16:54:152015年迎新春徽章
日期:2015-03-04 09:56:112015亚冠之浦和红钻
日期:2015-06-29 15:30:48
7 [报告]
发表于 2013-12-23 10:38 |只看该作者
  1. awk -F @ '(NF>1)?a=$0:a="chr"$0{print a}'

  2. awk -F @ '(NF>1)?a=$0:a=gensub(/([^ ]+)$/,"chr&",$0){print a}'
复制代码
  1. sed '/@/!s/^/chr/'

  2. sed '/@/!s/\([^ ]\+\)$/chr\1/'
复制代码
您需要登录后才可以回帖 登录 | 注册

本版积分规则 发表回复

  

北京盛拓优讯信息技术有限公司. 版权所有 京ICP备16024965号-6 北京市公安局海淀分局网监中心备案编号:11010802020122 niuxiaotong@pcpop.com 17352615567
未成年举报专区
中国互联网协会会员  联系我们:huangweiwei@itpub.net
感谢所有关心和支持过ChinaUnix的朋友们 转载本站内容请注明原作者名及出处

清除 Cookies - ChinaUnix - Archiver - WAP - TOP