加入目录中的所有文件

时间:2010-10-11 06:20:11

标签: bash join

如何加入目录中的所有文件。我可以通过明确命名下面的文件一步完成,有没有办法在没有明确命名文件的情况下完成它?

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)

4 个答案:

答案 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