极大的文本文件操作(添加列;更改列的内容)

极大的文本文件操作(添加列;更改列的内容)

我有一组非常大(80GB)的文件(基因组变异剂量),目前为“.txt.gz”,并具有以下布局(列/变量):

Chr RSID POS REF ALT Ind1 Ind2...Ind(n) 其中 1:n 是个体

我想编辑这个文件,以便:

  1. Chr 列/变量设置为所有行的特定染色体编号(例如 3)

  2. 在文件的特定位置插入了一个新列(我希望在 ALT 和 Ind1 之间插入新列/变量...这样新列将是编辑文件中的第六列)。我还希望将此列的值设置为常量(例如 0)。

最后,我想以与读入相同的格式输出编辑后的文件(因此,输出应该是“.txt.gz”

我感谢任何帮助,并很乐意提供更多详细信息。

答案1

解压缩文件,将未压缩的数据流传递给awk,让其awk进行修改,然后将流传递给gzip进行压缩。

gzip -c -d <file.txt.gz |
awk -F '\t' 'BEGIN { OFS = FS } { $1 = 3; $6 = 0 OFS $6 }; 1' |
gzip -c >newfile.txt.gz

awk命令将其输入字段分隔符 ( FS) 和输出字段分隔符 ( OFS) 设置为制表符。然后,它将第一个字段设置为3,将第 6 个字段设置为0,后跟制表符和旧的第 6 个字段。

1脚本最后的单独的部分awk导致修改后的数据被输出。

的输入awk是来自 的解压缩数据流gzip -d,来自 的输出awk经过gzip压缩。

如果数据有标题行需要我们单独修改:

gzip -c -d <file.txt.gz |
awk -F '\t' 'BEGIN { OFS = FS }
    NR == 1 {         $6 = "NEW" OFS $6 }
    NR != 1 { $1 = 3; $6 = 0     OFS $6 }; 1' |
gzip -c >newfile.txt.gz

这里我们根据输入行号做不同的事情。如果我们在第 1 行,我们将插入标头NEW作为新的第 6 个字段的标头。如果我们不在第 1 行,我们将像以前一样修改数据。

您也可以使用 执行此操作sed,但当您用 标记问题时,awk我假设这是您更喜欢使用的工具。

答案2

已确认适用于 gawk、mawk-1、mawk-2 和 nawk :

(…gunzip…)\
 \
 |  mawk 'BEGIN { _+=___=_+=(__=_^=OFS=FS="\t")+_ }\
                $_=(__==NR?"NEW":_<($__=___))FS $_'\
 | (…re-gzip…)

相关内容