我正在使用这种晦涩的文件格式处理数据:
SNP A1 A2 F1 I1 F2 I2 F3 I3
rs0001 A C 0.02 0.00 1.99
(注意前三个字段周围的空格)
标头很长(500k 条目),我想将其转换为如下内容:
SNP A1 A2 F1_I1 F2_I2 F3_I3
rs0001 A C 0.02 0.00 1.99
...这样无论是否删除不规则的空白,都可以更轻松地处理。作为参考,这也是可以接受的,只要它是一致的:
SNP A1 A2 F1_I1 F2_I2 F3_I3
rs0001 A C 0.02 0.00 1.99
有什么办法可以在 Unix/Linux 中重新格式化它吗?谢谢
您可以用
sed
以下内容覆盖第一行:这很有效,因为我们只读取和写入第一行。这只是一件有效的事情,因为我们正在写一行与我们阅读的那行长度完全相同的行。
Fn
如果和之间可能有多个空格,In
而您只想用一个替换它们_
,则不能使用该方法,而必须重写整个文件,例如:这会创建一个新的
file
作为原始文件的编辑副本。一些sed
实现已经-i
从perl
. 例如,使用 GNUsed
:也会工作。对于其他一些
sed
实现,您需要-i ''
. 您可能还需要替换\s
为[[:space:]]
.要用一个空格替换一个或多个空白字符的任何序列,您可以执行
s/[[:space:]]+/ /g
(withperl
,您需要添加该-l
选项,否则同样是空白的行定界符将包含在模式空间中并最终被替换带空格)。F<digits> I<digit>
请注意,正则表达式匹配不是很严格,如果在行中的任何地方查找,那么会在例如中找到它。可以使用以下方法进行更严格的匹配:PAF12 I0ther
perl
我们使用否定环视运算符来检查前后的内容是否不是非空白字符。
您链接到的 plink 文件格式规范包含许多奇怪的细节。
首先,有一些示例,其中“F1 I1”和“F2 I2”清楚地表示两个不同(但相关)列的标题:
但是还有您给出的示例,尽管
Ix
标题存在,但看起来列值丢失了:对我来说,不清楚这个例子是错误的还是数据实际上可以这样格式化。与该
dose1
选项相关的评论似乎暗示可以使用单列剂量数据而不是明显正常的两列格式:“剂量数据是 0..1,而不是 0..2 比例”。根据我的直觉,看起来只有一个值的示例数据的标题混淆了。如何处理不精确的规范和仅部分符合您对规范的理解的数据总是很困难的。您需要决定您的数据解析器应该有多大的容忍度,以便它能够正确处理带有轻微标题问题的文件,同时仍然标记无效数据。
关于您的实际文件处理问题:如果有一些外部指示器告诉您文件是否具有单值或双值剂量数据,我会使用您熟悉的
Ix
任何脚本或文本处理语言完全删除标题,无论它是sed
,awk
,perl
,python
或其他什么。