Bash 连接目录中的所有文件

Bash 连接目录中的所有文件,bash,join,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)

如何连接目录中的所有文件。我可以通过显式命名下面的文件一步完成,有没有不显式命名文件的方法

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)
join你可以通过
cat./*>输出文件

#/bin/bash
#!/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"
资料= 对于“${rpkmDir}”/HS*.chsn.rpkm中的f 做 如果[!“$data”] 然后 data=“$(排序“$f”)” 持续 fi data=“$(join因为(在经典UNIX和POSIX下)是定义的,所以它一次只能处理两个文件,所以您必须自己进行迭代

虽然你的符号非常小,但它也很难理解。我认为,你可以使用管道,而且事实上,“-”作为文件名表示改变顺序的标准输入。但困难的部分是在不创建任何显式临时文件的情况下将所有内容连接在一起。你最好只写一张纸条t编写脚本符号,并将其输入bash

可能(未经测试的脚本):

cd${rpkmDir}
ls HS*.chsn.rpkm|
{
读取文件
script=“排序$file”
读取文件时
做

script=“$script | join-使用awk,说您想在第一个字段加入

awk '{a[$1]=a[$1] FS $0}END{for(i in a) print i,a[i]}' file*

否-这不起作用。Join根据键在文件中查找匹配行(因为在每个文件的第一列上没有指定键),假设文件都按相同顺序排序。是否需要“回显”$data“进入bash的管道?或者解释您已经生成了脚本,并且需要执行作为shell脚本生成的内容?这确实是一个脚本。我希望顶部的shebang行能够让这一点变得明显。我认为这是一个编写脚本的脚本。然后您必须将脚本的输出输入shell。或者mally,您只需执行一个脚本即可…执行命令。在这里,您必须执行脚本,然后对输出运行bash。不正确。它使用命令和进程替换在
$data
中建立结果,并将其反馈到
join
每次迭代中。我应该提到我不需要消除不匹配d行,使@ghostdog74的答案最简洁,符合我的需要。不过,当我需要该功能+1时,您的答案将非常有用。我希望我可以接受两个答案。这不会消除file1包含键而file2不包含键的行,而join命令(无选项)确实消除了不匹配的行。如果我错了,请纠正我,但我没有看到OP说明这一要求。我在帖子中已经根据第一个字段的示例说明了我的假设。在OP详细说明其数据格式之前,所有解决方案都将基于胡乱猜测和假设。顺便说一句,包含代码来完成您的任务也不是那么困难你在假设。以某种方式使用粘贴似乎更适合此应用程序。使用粘贴时,你还必须进行排序。这是真的,无论如何,我想我必须选择Ignacio Vazquez Abrams的答案,因为它回答了原始问题,即使你的解决方案对我很有用。
awk '{a[$1]=a[$1] FS $0}END{for(i in a) print i,a[i]}' file*