我有一组非常大(80GB)的文件(基因组变异剂量),目前为“.txt.gz”,并具有以下布局(列/变量):
Chr RSID POS REF ALT Ind1 Ind2...Ind(n) 其中 1:n 是个体
我想编辑这个文件,以便:
Chr 列/变量设置为所有行的特定染色体编号(例如 3)
在文件的特定位置插入了一个新列(我希望在 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…)