如何转置大文件



我有一个包含 177 列和 54248 行的 CSV 文件,如下所示:

SNP_Name,Chr,Coordinate,R921B12,R921C12,R921D12,...
CL635944_160.1,0,0,CC,CC,CC,...
CR_594.1,0,0,TT,TT,TT,...
CR_816.1,0,0,CC,TT,TT,...

我需要有一个包含 54284 列和 177 行的制表符分隔文件,例如:

R921B12 C C T T C C ...
R921C12 C C T T T T ...
R921D12 C C T T T T ...

以下命令允许我转置单列(数字 3)

awk  '{ printf( "%s ", $3); } END { printf( "n" ); }' a.csv

但是我怎样才能为他们所有人做到这一点呢?

一次扫描一行输入文件,对于包含行号、字段编号和字段数据内容的每一行和字段,向临时文件写入一行。如前所述,临时文件将按行内的字段排序。对临时文件进行排序,使其按字段中的行排序,然后扫描临时文件并按所需顺序重建输出。

GNU datamash 有一个转置操作可以做到这一点。它还可以将字段分隔符从逗号更改为 TAB。下面是一个示例(a.csv如问题所示。

$ cat a.csv
SNP_Name,Chr,Coordinate,R921B12,R921C12,R921D12
CL635944_160.1,0,0,CC,CC,CC
CR_594.1,0,0,TT,TT,TT
CR_816.1,0,0,CC,TT,TT
$ # datamash transpose (cut removes first three fields)
$ cut -d , -f 4- a.csv | datamash --field-separator=, --output- 
delimiter=$'t' transpose
R921B12 CC  TT  CC
R921C12 CC  TT  TT
R921D12 CC  TT  TT

最新更新