如何加入目录中的所有文件。我可以通过明确命名下面的文件一步完成,有没有办法在没有明确命名文件的情况下完成它?
join <(\
join <(\
join <(\
join\
<(sort ${rpkmDir}/HS0477.chsn.rpkm)\
<(sort ${rpkmDir}/HS0428.chsn.rpkm) )\
<(sort ${rpkmDir}/HS0419.chsn.rpkm) )\
<(sort ${rpkmDir}/HS0299.chsn.rpkm) )\
<(sort ${rpkmDir}/HS0445.chsn.rpkm)
答案 0 :(得分:2)
#!/bin/bash
data=
for f in "${rpkmDir}"/HS*.chsn.rpkm
do
if [ ! "$data" ]
then
data="$(sort "$f")"
continue
fi
data="$(join <(sort "$f") /dev/stdin <<< "$data")"
done
echo "$data"
答案 1 :(得分:1)
由于join
(在Classic UNIX和POSIX下)被定义,所以它一次只能处理两个文件,所以你必须自己进行迭代。
虽然你的符号极其微不足道,但它也是难以理解的。很有可能你可以使用管道以及' - '作为文件名表示改变排序的标准输入的事实,我想。但困难的是将所有内容连接在一起而不创建任何明确的临时文件。您最好只编写一个编写脚本符号的脚本,并将其提供给bash。
可能(未经测试的脚本):
cd ${rpkmDir}
ls HS*.chsn.rpkm |
{
read file
script="sort $file"
while read file
do
script="$script | join - <(sort $file)"
done
} | bash
答案 2 :(得分:1)
使用awk,说你想加入第一场
awk '{a[$1]=a[$1] FS $0}END{for(i in a) print i,a[i]}' file*
答案 3 :(得分:0)
你可以做到 cat ./*&gt; outfile