2013-05-07 44 views
0

基于列的数据我想115个文件从一个目录结合在一起。这里的文件是什么样子的 例如:组合和多个文件和组织在bash

文件中的一个

 
Phenotype Marker Value1 Value2 Value3 
P1   1:54390 0.2948 0.4837 0.2198 
P2   1:54390 0.3482 0.6583 0.1937 
P3   1:54390 0.1983 0.1837 0.4177 
P4   1:54390 0.9128 0.9930 0.0043 
P5   1:54390 0.1938 0.0109 0.6573 
P1   1:69402 0.2039 0.2340 0.2346 
P2   1:69402 0.0239 0.3545 0.1987 
P3   1:69402 0.8239 0.8677 0.4177 
P4   1:69402 0.2498 0.3099 0.0765 
P5   1:69402 0.0982 0.0198 0.

文件中的两个

 
Phenotype Marker Value1 Value2 Value3 
P1   9:21048 0.8568 0.1231 0.1654 
P2   9:21048 0.1244 0.3213 0.1223 
P3   9:21048 0.9869 0.1231 0.4776 
P4   9:21048 0.3543 0.7657 0.0033 
P5   9:21048 0.1231 0.3213 0.8578 
P1   9:87758 0.1231 0.8768 0.4653 
P2   9:87758 0.7657 0.5435 0.8845 
P3   9:87758 0.9879 0.8437 0.7464 
P4   9:87758 0.1231 0.9879 0.5523 
P5   9:87758 0.9879 0.9868 0.0006 

所以基本上每一个文件都有一组独特的标记,所有每个地方表型(P1,P2,P3,P4,P5)与它们匹配。

有两件事情:

答:我想一个文件看起来像这样(如下图),其中数据由 表型组织

 
Phenotype Marker Value1 Value2 Value3 
P1   1:54390 0.2948 0.4837 0.2198 
P1   1:69402 0.2039 0.2340 0.2346 
P1   9:21048 0.8568 0.1231 0.1654 
P1   9:87758 0.1231 0.8768 0.4653 
P2   1:54390 0.3482 0.6583 0.1937 
P2   1:69402 0.0239 0.3545 0.1987 
P2   9:21048 0.1244 0.3213 0.1223  
P3   1:54390 0.1983 0.1837 0.4177 
P3   1:69402 0.8239 0.8677 0.4177 
P3   9:21048 0.9869 0.1231 0.4776 
P3   9:87758 0.9879 0.8437 0.7464 
P4   1:54390 0.9128 0.9930 0.0043 
P4   1:69402 0.2498 0.3099 0.0765 
P4   9:21048 0.3543 0.7657 0.0033 
P4   9:87758 0.1231 0.9879 0.5523 
P5   1:54390 0.1938 0.0109 0.6573 
P5   1:69402 0.0982 0.0198 0.
P5   9:21048 0.1231 0.3213 0.8578 
P5   9:87758 0.9879 0.9868 0.0006 

我想这样做是bash。任何人都可以提供一些见解吗?我是 这个语言很新!

B.一旦我有了这个巨大的文件,我也想节省基于 表型独立的文件(我打算做一些质量控制的中间步骤),所以我 将有5个文件P1 ,P2,P3,P4,和与它们各自的数据P5在 其它列)

回答

2

要解决A,你可以使用spiehr提出的方法。为了解决B:

# Name of your big merged file 
BIG_FILE='...' 


TYPES='P1 P2 P3 P4 P5'  
for T in $TYPES; do 
    # Will reduce the input file to 
    # all lines starting with $T, which is one of P1, P2 etc., 
    # and write them to a file named accordingly 
    grep "^$T" $BIG_FILE > file_$T 
done 
0

为了得到标题,带有列标题:

head -1 > tmpfile 

数据可以插入这样的:

for file in $(ls); do 
    tail -n +2 ${file} >> tmpfile2 
done 
sort tmpfile2 >> tmpfile 
rm tmpfile2 

TMPFILE将与所有数据文件。 而不是写$(ls),你可以添加另一个linux命令,即列出你所有的相关文件。

对于第一列掌握“P3”只有条目,你可以使用grep:

grep '^P3' tmpfile | cut -f1 --complement 

cut命令用来切出的第一个条目,你也许并不需要它了。

+0

这并不涵盖表型 – 2013-05-07 19:43:30

+0

现在排序是这样,那种错字...... – spiehr 2013-05-07 19:45:03

+1

使用'在文件*;做'而不是调用'ls'。 – chepner 2013-05-07 21:55:07

2
#!awk -f 
{ 
    /Phenotype/ ? hd=$0 : rw[$0] 
} 
END { 
    print hd 
    PROCINFO["sorted_in"] = "@ind_str_asc" 
    for (each in rw) print each 
} 
0

我会写的第一步是

{ 
    sed 1q file1 
    sed 1d * | sort 
} > file_all 

然后

awk ' 
    FNR == 1 {head = $0; next} 
    !seen[$1]++ {print head > $1} 
    {print > $1} 
' file_all 

这导致在名为 “P1”, “P2” 文件等