从 tab-delimited 个文件中提取数字

Extract numbers from tab-delimited files

我有一个 tab-delimited.txt 文件,它有 4 行和 4 列。我想从 txt 文件中提取数字(整数、小数和科学记数法)。数字位于第 2-4 行和第 2-4 列(第一行是 header,第一列是行名)。 文件内容粘贴如下:

component   sigma          h2           h2_se
G           -5.55758e-19   -0.0964725   26.3887
GxE         6.13144e-18    1.09647      26.3651
noise       0              0            0

这是所需的输出,由于要进一步处理此输出,我想在末尾附加换行符 \n

-5.55758e-19 -0.0964725 26.3887 6.13144e-18 1.09647 26.3651 0 0 0

非常感谢任何帮助!

下面是我试过的一些代码,它没有产生我想要的结果:

grep -o '0.[[:digit:]]*' myfile

grep -o '[[:digit:]]*' myfile

============================================= =======

这是对我有用的代码,非常感谢@tink!

awk 'NR>1 {printf "%s %s %s ", ,,}END{printf "\n"}' myfile

$ awk 'NR>1{=""; out=out [=10=]} END{[=10=]=out; =; print}' file
-5.55758e-19 -0.0964725 26.3887 6.13144e-18 1.09647 26.3651 0 0 0

或者这些也可以:

$ awk 'NR>1{printf "%s%s %s %s", sep, , , ; sep=OFS} END{print ""}' file
-5.55758e-19 -0.0964725 26.3887 6.13144e-18 1.09647 26.3651 0 0 0

$ awk 'NR>1{printf "%s%s %s %s", (NR>2 ? OFS : ""), , , } END{print ""}' file
-5.55758e-19 -0.0964725 26.3887 6.13144e-18 1.09647 26.3651 0 0 0

如果您的第一个字段可以包含空白,则在脚本开头添加 -F'\t'

$ cut -f2- < file | tail -n+2 | paste -s - | tr '\t' ' '
-5.55758e-19 -0.0964725 26.3887 6.13144e-18 1.09647 26.3651 0 0 0

以下grep提取所有整数或实数的单词:

$ grep -owE '[-+]?[0-9]*([.][0-9]*([Ee][-+][0-9]+)?)?' file | tr '\n' ' '

由于您的输入文件的性质,这才有效。

Ed Morton 提出的 awk 程序是一种可靠的方法

这是对我有用的代码,非常感谢@tink!添加\n进行下一步处理。

awk 'NR>1 {printf "%s %s %s ", ,,}END{printf "\n"}' myfile

对于没有尾随 space 的输出,使用

awk 'NR>1 {printf "%s %s %s ", ,,}' myfile

我会按照以下方式使用 GNU AWK 完成此任务,令 file.txt 内容为

component   sigma          h2           h2_se
G           -5.55758e-19   -0.0964725   26.3887
GxE         6.13144e-18    1.09647      26.3651
noise       0              0            0

字段由单个 \t then

分隔
awk 'BEGIN{ORS=""}NR>1{="";print}' file.txt

产出

 -5.55758e-19 -0.0964725 26.3887 6.13144e-18 1.09647 26.3651 0 0 0

说明:我通知 GNU AWK 使用空字符串作为输出行分隔符 (ORS) 然后对于第一行之后的每一行,我将第一个字段设置为空字符串并且 print这样的改线。请注意,输出字符串有前导 space 并且末尾没有换行符,如果您需要换行符添加 END{print "\n"}.

(在 GNU Awk 5.0.1 中测试)

或者,您可以通过管道传输一些 linux 实用程序以获得类似的效果,如下所示

tail -3 file.txt | cut -f 2,3,4 | tr '\n\t' '  '

产出

-5.55758e-19 -0.0964725 26.3887 6.13144e-18 1.09647 26.3651 0 0 0 

说明:使用 tail 获取最后 3 行,然后通过 cut 获取列 2,3,4,然后将换行符更改为 spaces,将制表符更改为 spaces使用 tr.