从 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
.
我有一个 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
.