免费注册 查看新帖 |

Chinaunix

  平台 论坛 博客 文库
最近访问板块 发新帖
楼主: Agnes_ss
打印 上一主题 下一主题

[文本处理] 将表头的每一个ID编号替换为各自对应的名称 [复制链接]

论坛徽章:
2
摩羯座
日期:2014-11-03 15:28:56卯兔
日期:2015-01-04 17:20:51
11 [报告]
发表于 2014-11-04 14:45 |只看该作者
回复 9# Agnes_ss


    awk的语法,请看精华帖吧

   大致说一下,NR==FNR表示这段处理的是前一个文本,里面a[xx]=yyy表示生成哈希数组a,其中xx下标的元素值为yyy
    后面就是判断,如果a[xx]存在,则用yyy来替换xx

论坛徽章:
2
摩羯座
日期:2014-11-03 15:28:56卯兔
日期:2015-01-04 17:20:51
12 [报告]
发表于 2014-11-04 14:59 |只看该作者
回复 10# Agnes_ss
  1. awk -vOFS=\t xxxx
复制代码

论坛徽章:
0
13 [报告]
发表于 2014-11-04 15:30 |只看该作者
回复 12# bulletmarquis


    输出结果没变,还是用空格分割的。。

论坛徽章:
2
摩羯座
日期:2014-11-03 15:28:56卯兔
日期:2015-01-04 17:20:51
14 [报告]
发表于 2014-11-04 15:38 |只看该作者
回复 13# Agnes_ss


    把你执行的语句贴一下吧

   如果输出不变,可以在后面那段加一个NF+=0

论坛徽章:
0
15 [报告]
发表于 2014-11-04 16:14 |只看该作者
  1. qiime@qiime-VirtualBox:~/Agnes/test$ awk 'NR==FNR{a[$1]=$2;next}FNR==1{for(i=2;i<=NF;i++){if(a[$i])$i=a[$i]}}1' b a > c
  2. qiime@qiime-VirtualBox:~/Agnes/test$ awk -vOFS=\t xxxx c
  3. qiime@qiime-VirtualBox:~/Agnes/test$ head c
  4. OTU ID SGM2 CL2 SGM1 DDZ1 LSM2 LSM3 XL3 DZ1 DZ3 CL1 DZ6 HJH1 DWZD3 WLJ2 QLQ3 DWZD2 taxonomy
  5. OTU1        1        0        35        0        0        0        0        0        0        0        21        0        0        0        0        0        d__Archaea; p__Euryarchaeota
  6. OTU2        0        2        0        0        5        0        12        0        0        0        0        0        7        0        0        0        d__Archaea; p__Euryarchaeota
复制代码
回复 12# bulletmarquis


   

论坛徽章:
2
摩羯座
日期:2014-11-03 15:28:56卯兔
日期:2015-01-04 17:20:51
16 [报告]
发表于 2014-11-04 16:20 |只看该作者
回复 15# Agnes_ss


    大哥你太有才了。。。。
  1. awk -vOFS='\t' 'NR==FNR{a[$1]=$2;next}FNR==1{for(i=2;i<=NF;i++){if(a[$i])$i=a[$i]}}1' b a
复制代码

论坛徽章:
0
17 [报告]
发表于 2014-11-04 18:12 |只看该作者
回复 16# bulletmarquis


    我啥都不懂。。

论坛徽章:
0
18 [报告]
发表于 2014-11-04 18:13 |只看该作者
回复 16# bulletmarquis


    但是第一个OTU与ID之间的空格要保留啊

论坛徽章:
2
摩羯座
日期:2014-11-03 15:28:56卯兔
日期:2015-01-04 17:20:51
19 [报告]
发表于 2014-11-04 19:50 |只看该作者
回复 18# Agnes_ss


    如果你的原始文本就是以TAB间隔的话,可以这么写
  1. awk -vFS='\t' -vOFS='\t' 'NR==FNR{a[$1]=$2;next}FNR==1{for(i=2;i<=NF;i++){if(a[$i])$i=a[$i]}}1' b a
复制代码

论坛徽章:
0
20 [报告]
发表于 2014-11-04 21:04 |只看该作者
回复 19# bulletmarquis


    这样的话,就是原来的表格,编号没有被名称替换
您需要登录后才可以回帖 登录 | 注册

本版积分规则 发表回复

  

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

清除 Cookies - ChinaUnix - Archiver - WAP - TOP