我试图编写一个脚本,每个文件都需要两列,并将它们水平连接在一起。问题是,列的内容在文件中的顺序不同,所以数据需要在连接之前进行排序。来自多个文件的列的水平合并
这是我想出迄今:
!/bin/bash
ls *.txt > list
while read line; do
awk '{print $2}' "$line" > f1
awk '{print $8}' "$line" > f2
paste f1 f2 | sort > "$line".output
done < list
ls *.output > list2
head -n 1 list2 > start
while read line; do
cat "$line" > output
done < start
tail -n +2 list2 > list3
while read line; do
paste output "$line" | cat > output
done < list3
我的编程是可能不是有效的,但它确实我想要它做的,与倒数第二行以外的东西,这不会将文件连接在一起。如果我在命令行中输入该行,它可以正常工作,但在while循环中会丢失列。
数据文件是这样的:
bundle_id target_id length eff_length tot_counts uniq_counts est_counts eff_counts ambig_distr_alpha ambig_distr_beta fpkm fpkm_conf_low fpkm_conf_high solvable tpm
1 comp165370_c0_seq1 297 0.000000 0 0 0.000000 0.000000 0.000000e+00 0.000000e+00 0.000000e+00 0.000000e+00 0.000000e+00 F 0.000000e+00
2 comp75418_c0_seq1 1371 852.132325 35 0 0.005490 0.008832 8.287807e-04 5.283100e+00 4.583199e-04 0.000000e+00 2.425095e-02 T 6.225299e-04
3 comp76235_c0_seq1 1371 871.645349 44 9 43.994510 69.198412 2.002884e+00 3.142003e-04 3.590738e+00 3.516301e+00 3.665174e+00 T 4.877251e+00
4 comp31034_c0_seq1 379 251.335522 14 0 7.049180 10.629771 1.000000e+00 1.000000e+00 1.995307e+00 0.000000e+00 5.957982e+00 F 2.710199e+00
5 comp36102_c0_seq1 379 234.689179 14 0 6.950820 11.224893 1.000000e+00 1.000000e+00 2.107017e+00 0.000000e+00 6.350761e+00 F 2.861933e+00
6 comp26522_c0_seq1 220 0.000000 0 0 0.000000 0.000000 0.000000e+00 0.000000e+00 0.000000e+00 0.000000e+00 0.000000e+00 F 0.000000e+00
7 comp122428_c0_seq1 624 0.000000 0 0 0.000000 0.000000 0.000000e+00 0.000000e+00 0.000000e+00 0.000000e+00 0.000000e+00 F 0.000000e+00
我需要的target_id和eff_counts列。
这不是完整的问题,但我认为我会从小处着手。稍后我希望目标ID仅在开始时出现一次。我想在新文件中有一个标题,其中包含对特定列作出贡献的文件的名称。
target_id file_1 file_2 file_3
comp26522_c0_seq1 0.000000 [number] [number]
comp31034_c0_seq1 10.629771 [number] [number]
comp36102_c0_seq1 11.224893 [number] [number]
comp75418_c0_seq1 0.008832 [number] [number]
comp76235_c0_seq1 69.198412 [number] [number]
comp122428_c0_seq1 0.000000 [number] [number]
comp165370_c0_seq1 0.000000 [number] [number]
编辑: 我在示例中添加了更多信息。 [号码]只是占位符;实际上,它们将是与file_1下的行类似的数字。此外,头文件“file_1”将是输入文件的名称。 target_id应该排序。所有文件应包含相同的target_id,但所有文件的顺序不同。
编辑二:输出
我有四个文件进行了测试,输出如下:
comp0_c0_seq1 0.000000
comp100000_c0_seq1 1.919404
comp100002_c0_seq1 2.118776
comp100003_c0_seq1 0.072916
comp100004_c0_seq1 0.000000
comp100005_c0_seq1 0.000000
comp100006_c0_seq1 1.548160
comp100007_c0_seq1 7.616481
comp100008_c0_seq1 0.000000
comp100009_c0_seq1 1.374209
有一个空列与数据第一列的左侧。并且只有来自最后一个文件的数据存在。
谢谢你的帮助!
更新:
我解决了第二行的问题。这是我使用的代码:
while read line; do
join output "$line" > output2
cat output2 > output
done < list3
这是输出:
comp0_c0_seq1 0.000000 0.000000 0.000000 0.000000
comp100000_c0_seq1 1.919404 1.919404 0.000000 1.919404
comp100002_c0_seq1 2.118776 2.118776 2.225852 2.118776
comp100003_c0_seq1 0.072916 0.072916 1.228136 0.072916
comp100004_c0_seq1 0.000000 0.000000 0.000000 0.000000
comp100005_c0_seq1 0.000000 0.000000 1.982851 0.000000
comp100006_c0_seq1 1.548160 1.548160 1.902749 1.548160
comp100007_c0_seq1 7.616481 7.616481 0.000000 7.616481
comp100008_c0_seq1 0.000000 0.000000 0.000000 0.000000
comp100009_c0_seq1 1.374209 1.374209 1.378667 1.374209
现在我只需要弄清楚如何添加页眉与所有的文件名的文件的顶部。
第二部分不清楚。 '23''0''100'是什么意思? – nu11p01n73R 2014-10-09 09:22:23
这些是eff_counts列中的数字。 最后他们应该四舍五入到一个整数,这是probalby为什么我把这些数字作为一个例子,但在他们是浮动文件。 这是我以为我可以很容易地纠正在R一旦我得到正确的输入文件。 – 2014-10-09 09:39:24
在所需的输出23中,特定target_id的file_1中的eff_counts总数是多少?你能给更多的源数据行来获得更好的图片吗? – Kokkie 2014-10-09 15:08:50