Unix 不从文件中提取数值

Unix 不从文件中提取数值,unix,Unix,我试图从如下矩阵中提取非数值: 32540_at 0.138306 78047_s_at 0.133885 81737_at 0.163546 81811_at 0.181725 AAGAB 0.157073 AARSD1 0.114351 (文件包含不同长度的行,但每次名称后面都跟一个数字) 具体来说,我需要的输出如下: 32540_at 78047_s_at 81737_at 81811_at AAGAB AARSD1 由于

我试图从如下矩阵中提取非数值:

32540_at        0.138306  78047_s_at    0.133885 81737_at   0.163546 81811_at   0.181725 AAGAB          0.157073 AARSD1         0.114351
(文件包含不同长度的行,但每次名称后面都跟一个数字)

具体来说,我需要的输出如下:

32540_at 78047_s_at 81737_at 81811_at AAGAB AARSD1
由于像81737_这样的名称结构,提取字母数字字符对我来说太难了(因为我在Unix编程方面缺乏经验),所以我尝试从数字字符中区别提取非数字字符。 也就是说,删除数字字段后,非数字字段将直接保留在那里。 如何做到这一点

最好的


Eleonora你说名字后面总是跟数字?那么:

tr -s ' ' '\n' your_file | sed -n '1~2p'

通过合理的
RS
ORS
设置,这对于
awk
是相当直接的:

awk -v RS=' +|\n' -v ORS=' ' '!/^[0-9.]+$/'
输出:

32540_at 78047_s_at 81737_at 81811_at AAGAB AARSD1 
解释
  • RS='+\n'
    :用空格或换行符分隔每条记录
  • ORS=''
    :在打印的每条记录后插入空格
  • /^[0-9.]+$/
    :如果记录不仅包含数字和点,请打印它。更正确的数字模式是(不考虑科学符号):
    /^([0-9]+\.[0-9]*.[0-9]*\.[0-9]+\.[0-9]+\.?)$

没错!名称是基因名称,而数字是互信息值。我只需要基因的名字Hi Thor!非常感谢你的帮助!由于我有一个名为ex.split1.txt、split2.txt的文件列表,如何才能在循环中插入代码,以输入以split开头的所有文件?再次感谢,这取决于您想对输出做什么。如果可以是顺序的,只需在
awk
命令后添加文件名,
awk
将自动解析它们。