我有〜30个文件,每个单独的文件包含两列,第一列是ID列,第二列是数字。我想将所有文件合并到一个文件中,而不是通过简单的串联命令。在一个单独的文件中,我需要所有ID 1 列中的值以及各自列中每个 ID 的相应值。如果任何一个文件中都不存在一个 ID,则分数可以为零。
该ID
列没有相同数量的条目,它与每个文件有很大不同。
单个文件示例
- 10_S9.计数.矩阵
ID 10_S9 TRI_DN0_c0_g1 12717.85 TRI_DN100000_c0_g1 93.65 TRI_DN100001_c0_g1 110.58 TRI_DN100002_c0_g1 80.76 TRI_DN100003_c0_g1 386.84 TRI_DN100004_c0_g1 137.85 TRI_DN100005_c0_g1 52.14 TRI_DN100006_c0_g1 87.19 TRI_DN100009_c0_g1 27.88
- 11_S13.计数.矩阵
ID 11_S13 TRI_DN0_c0_g1 22358.82 TRI_DN0_c2_g1 164.98 TRI_DN100000_c0_g1 164.40 TRI_DN100001_c0_g1 140.92 TRI_DN100002_c0_g1 196.00 TRI_DN100003_c0_g1 46.94 TRI_DN100004_c0_g1 71.21 TRI_DN100005_c0_g1 106.48 TRI_DN100006_c0_g1 28.96
- 12_S17.计数.矩阵
ID 12_S17 TRI_DN0_c0_g1 11195.36 TRI_DN0_c1_g1 490.24 TRI_DN0_c2_g1 64.11 TRI_DN0_c3_g1 14459.43 TRI_DN0_c4_g1 4173.92 TRI_DN0_c5_g1 4015.54 TRI_DN1_c0_g1 194.56 TRI_DN1_c0_g1 26.99 TRI_DN1_c0_g1 1078.54
- 13_S21.计数.矩阵
ID 13_S21 TRI_DN0_c0_g1 40754.51 TRI_DN1_c0_g1 85.85 TRI_DN1_c0_g1 80.68 TRI_DN1_c0_g1 78.92 TRI_DN1_c0_g1 101.48 TRI_DN1_c0_g1 94.66 TRI_DN1_c0_g1 189.68 TRI_DN1_c0_g1 39.68 TRI_DN1_c0_g1 199.86
- 14_S26.计数.矩阵
ID 14_S26 TRI_DN0_c0_g1 35750.85 TRI_DN0_c0_g2 1521.63 TRI_DN0_c0_g3 8969.77 TRI_DN0_c1_g1 13918.85 TRI_DN0_c1_g2 797.95 TRI_DN0_c2_g1 83624.41 TRI_DN0_c3_g1 669.73 TRI_DN0_c4_g1 53.83 TRI_DN1_c0_g1 235.10
- 最终的表应该是这样的:
ID 10_S9 11_S13 12_S17 13_S21 14_S26 TRI_DN0_c0_g1 334.30 678 98.0 56.0 98.0 * TRI_DN0_c1_g1 200.44 0 859.36 89.03 0 TRI_DN0_c2_g1 12.32 34 12.56 64.6 78.9 * TRI_DN100000_c0_g1 20.79 0 0 0 0 TRI_DN100001_c0_g1 24.18 34.3 12.56 64.6 78.9 TRI_DN100002_c0_g1 73.50 67.8 98.8 56.0 98.0 * TRI_DN100003_c0_g1 162.44 10.25 456.23 98.45 0 TRI_DN100004_c0_g1 55.98 3.34 6.78 98.0 1.5 TRI_DN100005_c0_g1 77.86 55.98 3.34 73.50 67.8
其中*
符号表示 ID 仅存在于 10_S9、12_S17、13_S21 中,而在 11_S13、14_S26 中不存在,给定分数为零“0”。
请帮助我生成这个表/矩阵。
答案1
可以使用“tcsh script.csh”运行的 tcsh 脚本
#script.csh
egrep -v '==>|ID' *.matrix | sort -k2,2 -k1,1 | sed -e's/\.counts.matrix:/ /g' | sort -k2,2 -u | awk '{printf(" %s 0.0\n",$2)}' > allIDs.txt
foreach xx ( ` ls -1d *.matrix ` )
set yy = ` echo $xx | sed -e's/matrix/matrix.tmp/g' `
cat $xx allIDs.txt | xargs -L1 | sort -k1,1 -k2,2gr | awk 'BEGIN {last="xxx"} { if ( $1 != last ) printf(" %s\n",$0) ; last=$1}' > $yy
end
( echo ' ID '; ls -1d *.counts.matrix.tmp | sed -e's/.counts.matrix.tmp//g' | sort -k1,1 ) | xargs | sed -e's/ / /g' -e's/ID / ID /g' > table.txt
egrep -v '==>|ID' *.matrix.tmp | sort -k2,2 -k1,1 -k3,3gr | sed -e's/.counts.matrix.tmp//g' | awk 'BEGIN {last="xxx"} { if ($2!=last) { if (last != "xxx") printf("\n"); printf("%s ",$2);} printf("%s ",$3); last=$2} END{printf("\n")}' >> table.txt
unset xx yy
将输出放入文件“table.txt”中,但格式不太好。只写出多个值中的最大值。还会创建垃圾“.matrix.tmp”文件作为中间体。一个快速脚本可以完成这项工作,但不是最好的。
还假定文件名与输出文件中的列标题一致。