连接多个文件

时间:2014-05-20 15:07:33

标签: bash shell concatenation

我有多个文件,每个文件中都包含以下内容:

>HM001
ATGCT...
>HM002
ATGTC...
>HM003
ATGCC...
即,每个文件包含物种HM001至HM050的一个基因序列。我想连接所有这些文件,所以我有一个文件,包含物种HM001到HM050的基因组:

>HM001
ATGCT...ATGAA...ATGTT
>HM002
ATGTC...ATGCT...ATGCT
>HM003
ATGCC...ATGC...ATGAT

最终文件中实际上不需要省略号。我想猫应该用,但我不知道怎么做。任何想法都将不胜感激。

5 个答案:

答案 0 :(得分:3)

使用awk可以更轻松地进行数据分析和格式化。试试这个:

awk -v RS=">" 'FNR>1{a[$1]=a[$1]?a[$1] FS $2:$2}END{for(x in a) print RS x ORS a[x]}' f1 f2 f3

对于以下文件:

==> f1 <==
>HM001
ATGCT...
>HM002
ATGTC...
>HM003
ATGCC...

==> f2 <==
>HM001
ATGDD...
>HM002
ATGDD...
>HM003
ATGDD...

==> f3 <==
>HM001
ATGEE...
>HM002
ATGEE...
>HM003
ATGEE...

awk -v RS=">" 'FNR>1{a[$1]=a[$1]?a[$1] FS $2:$2}END{for(x in a) print RS x ORS a[x]}' f1 f2 f3
>HM001
ATGCT... ATGDD... ATGEE...
>HM002
ATGTC... ATGDD... ATGEE...
>HM003
ATGCC... ATGDD... ATGEE...

答案 1 :(得分:0)

如何使用echo添加它们 - 沿着这些线?:

find . -type f -exec bash -c 'echo "append this" >> "$0"' {} \;

来源:https://stackoverflow.com/a/15604608/1662973

我会使用&#34;输入&#34;,但那是MSDOS。以上内容应该适合你。

答案 2 :(得分:0)

我建议您将您的文件组转换为CSV格式吗?差不多 正是你所建议的,并且很容易被合并到一起 关于任何处理申请(例如,Excel,R,python)。

在前面,我假设所有物种和基因序列都很简单 字母数字,没有空格或类似引号的字符。我也在假设 访问{n}中标准的sedsortuniq, MacOSX,可通过Windows轻松访问 msyscygwin,仅举两个。

首先,生成一个文件名和种类的数组。我假设了 文件名为file1file2等。只需调整第一行即可 因此,它只是一个glob,而不是一个执行过的命令。

FILES=($(file*))
SPECIES=($(sed -ne 's/^>//gp' file* | sort | uniq))

这给了我们每个物种一行,分类,没有重复。这个 确保我们的列是独立的并且集合是完整的。

接下来,创建一个包含命名列的CSV标题行,将其转储到 名为csvfile的CSV文件:

echo -n "\"Species\"" > csvfile
for fn in ${FILES[@]} ; do echo -n ",\"${fn}\"" ; done >> csvfile
echo >> csvfile

现在遍历每个基因序列并从所有文件中提取它:

for sp in ${SPECIES[@]} ; do
    echo -n "\"${sp}\""
    for fn in ${FILES[@]}; do
        ANS=$(sed -ne '/>'${sp}'/,/^/ { /^[^>]/p }' ${fn})
        echo -n ",\"${ANS}\""
    done
    echo
done >> csvfile

这适用于较大的数据集(即,较大的数据集)效率低 文件和/或物种的数量)。更好的实现(例如,python, ruby,perl,甚至R)会读取每个文件一次,形成一个 内部维护的矩阵,字典或关联数组,以及 在一个块中写出CSV。

答案 3 :(得分:0)

我能想到的最简单的方法就是使用猫。例如(假设您使用* nix类型系统):

cat file1 file2 file3 > outfile

答案 4 :(得分:0)

另一个awk实现:

awk '
    {key=$0; getline; value[key] = value[key] $0} 
    END {for (key in value) {print key; print value[key]}}
' file ...

现在,这可能不会按排序顺序输出键:数组键本身是未排序的。要确保排序输出,请使用gawk和

awk '
    {key=$0; getline; val[key] = val[key] $0} 
    END {
        n = asorti(val, keys)
        for (i=1; i<=n; i++) {print keys[i]; print val[keys[i]]}
    }
' file ...