我有一个包含 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