我有多个文件,每个文件中都包含以下内容:
>HM001
ATGCT...
>HM002
ATGTC...
>HM003
ATGCC...
即,每个文件包含物种HM001至HM050的一个基因序列。我想连接所有这些文件,所以我有一个文件,包含物种HM001到HM050的基因组:
>HM001
ATGCT...ATGAA...ATGTT
>HM002
ATGTC...ATGCT...ATGCT
>HM003
ATGCC...ATGC...ATGAT
最终文件中实际上不需要省略号。我想猫应该用,但我不知道怎么做。任何想法都将不胜感激。
答案 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}中标准的sed
,sort
和uniq
,
MacOSX,可通过Windows轻松访问
msys或
cygwin,仅举两个。
首先,生成一个文件名和种类的数组。我假设了
文件名为file1
,file2
等。只需调整第一行即可
因此,它只是一个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 ...