我有一个像这样的 CSV 输入文件格式,字段 1 中包含核苷酸序列,字段 2 中包含文本,字段 4 中包含整数:
ATGC,CD3,56
ATGC,CD4,67
ATGC,IgD,126
ATGC,IgM,127
AGTC,CD3,67
AGTC,CD4,78
AGTC,IgD,102
AGTC,IgM,89
TCGA,CD3,334
TCGA,CD4,123
TCGA,IgD,456
TCGA,IgM,80
CGTA,CD3,54
CGTA,CD4,32
CGTA,IgD,82
CGTA,IgM,117
我在 Mac 中使用 Numbers 打开了这个 CSV 文件,它显示为 3 列格式,但是,我想将其转换为表格(或矩阵)格式(也是 CSV 文件),将第一列(核苷酸序列)转换为标题,并希望结果也看起来像表格(或矩阵):
ATGC AGTC TCGA CGTA
CD3 56 67 334 54
CD4 67 78 123 32
IgD 126 102 456 82
IgM 127 89 80 117
以下是我的真实输入 CSV 文件的一部分(示例input.txt
):
AGAATAGTCTGATTCT,-,,38
AGAATAGTCTGATTCT,AnnexinV,,51
AGAATAGTCTGATTCT,CD127,,39
AGAATAGTCTGATTCT,CD138,,3
AGAATAGTCTGATTCT,CD14,,2
AGAATAGTCTGATTCT,CD16,,4
AGAATAGTCTGATTCT,CD19,,10
AGAATAGTCTGATTCT,CD20,,6
AGAATAGTCTGATTCT,CD24,,21
AGAATAGTCTGATTCT,CD25,,4
AGAATAGTCTGATTCT,CD27,,87
AGAATAGTCTGATTCT,CD3,,235
AGAATAGTCTGATTCT,CD34,,5
AGAATAGTCTGATTCT,CD38,,18
AGAATAGTCTGATTCT,CD4,,412
AGAATAGTCTGATTCT,CD43,,99
AGAATAGTCTGATTCT,CD5,,430
AGAATAGTCTGATTCT,CD56,,3
AGAATAGTCTGATTCT,CD8,,7
AGAATAGTCTGATTCT,IgD,,4
AGAATAGTCTGATTCT,IgM,,2
TGTGGTAGTTCGTCTC,-,,9
TGTGGTAGTTCGTCTC,AnnexinV,,42
TGTGGTAGTTCGTCTC,CD127,,6
TGTGGTAGTTCGTCTC,CD138,,4
TGTGGTAGTTCGTCTC,CD16,,40
TGTGGTAGTTCGTCTC,CD19,,7
TGTGGTAGTTCGTCTC,CD20,,2
TGTGGTAGTTCGTCTC,CD24,,24
TGTGGTAGTTCGTCTC,CD25,,2
如何使用 Linux 文本格式化命令来做到这一点?
答案1
使用 awk:
{
ks[$1 $2] = $3; # save the third column using the first and second as index
k1[$1]++; # save the first column
k2[$2]++; # save the second column
}
END { # After processing input
for (j in k1) { # loop over the first column
printf "\t%s", j; # and print column headers
};
print ""; # newline
for (i in k2) { # loop over the second
printf "%s", i; # print it as row header
for (j in k1) { # loop over first again
printf "\t%s", ks[j i]; # and print values
}
print ""; # newline
}
}
输出:
~ awk -F, -f foo.awk foo
AGTC ATGC CGTA TCGA
CD4 78 67 32 123
IgD 102 126 82 456
IgM 89 127 117 80
CD3 67 56 54 334
答案2
使用米勒(https://github.com/johnkerl/miller) 和
mlr --n2p --ifs "," label key,property,emptyfield,value \
then reshape -s key,value \
then unsparsify \
then cut -x -f emptyfield input.csv
你将会拥有
property AGAATAGTCTGATTCT TGTGGTAGTTCGTCTC
- 38 9
AnnexinV 51 42
CD127 39 6
CD138 3 4
CD14 2 -
CD16 4 40
CD19 10 7
CD20 6 2
CD24 21 24
CD25 4 2
CD27 87 -
CD3 235 -
CD34 5 -
CD38 18 -
CD4 412 -
CD43 99 -
CD5 430 -
CD56 3 -
CD8 7 -
IgD 4 -
IgM 2 -
答案3
解决您的任务的脚本awk
:
脚本.awk
{
arr[$1,$2] = $4; # read array values
c1[$1] = 1; # read row headers
c2[$2] = 1; # read row indexes
}
END { # start fancy printing
printf ("%-18s",""); # first line empty tab
for (i1 in c1) printf("%-18s",i1); printf "\n"; # print headers
# print rows
for (i2 in c2) {
printf("%-18s",i2); # print row index
for (i1 in c1) {
printf("%-18d", arr[i1,i2]); # print row's values
}
printf "\n"; # terminat current row with newline
}
}
运行:
awk -F "," -f script.awk input.txt
输出:
TGTGGTAGTTCGTCTC AGAATAGTCTGATTCT
CD4 0 412
CD24 24 21
CD5 0 430
CD43 0 99
CD34 0 5
CD25 2 4
CD16 40 4
IgD 0 4
CD27 0 87
CD8 0 7
CD19 7 10
CD56 0 3
CD38 0 18
AnnexinV 42 51
- 9 38
CD127 6 39
CD20 2 6
CD138 4 3
IgM 0 2
CD3 0 235
CD14 0 2