通过类似名称将更多文件放在目录中

时间:2016-06-27 20:33:55

标签: loops awk filenames cat

我在同一目录中有以下五个文件(名称末尾.bed and start染色体and have numbers such as 1-5`嵌入中间;显示一行内容或每个文件):< / p>

chromosome1-5.bed

chromosome1     1   21

chromosome1-2.bed

chromosome1     7   30

chromosome1-9.bed

chromosome1     9   75

chromosome2-1.bed

chromosome2     8   50

chromosome2-5.bed

chromosome2     6   23

我尝试捕获文件,这些文件以相同的编号开头于一个文件(因此1中的所有文件都带有前导1-5等。

预期输出:

chromosome1.bed

chromosome1     1   21 
chromosome1     7   30
chromosome1     9   75

chromosome2.bed

chromosome2     8   50 
chromosome2     6   23

此时我尝试将目录的任何文件与另一个文件名进行比较。

for i in /dir/*; do
    for j in /dir/*; do
        filename=$(basename "$i")
        filename2=$(basename "$j")
        if "$filename" != "$filename2";
        then cat "$i" "$j" > newfile
        fi
    done
done 

3 个答案:

答案 0 :(得分:4)

awk '!/^---/ {fname= $1".bed"; print $0 > fname }' *-[0-9].bed

<强>输出

cat chromosome1.bed

chromosome1     7   31
chromosome1     1   21
chromosome1     9   75


cat chromosome2.bed

chromosome2     8   50
chromosome2     6   23

此脚本会跳过以----开头的行,并在剩余数据行的第一个字段中创建文件名。我们将".bed"附加到该名称,然后将完整行写入(>)到指定文件。随着$1的值发生变化,文件名也会发生变化。

修改

由于您修改后的示例数据不再包含------行,因此可以进一步简化为

awk '{fname= $1".bed"; print $0 > fname }' *-[0-9].bed

无需过滤行----,并且该测试已被删除。现在,所有行都将自动打印到基于第一个字段创建的文件名中。

编辑2

为了允许将文件写入备用目录,一种方法是将目录名称作为变量传递,并将其预先附加到正在创建的fname,即

awk -v dir="NewDirectory" '{fname= dir "/" $1 ".bed"; print $0 > fname }' *-[0-9].bed

当然,"NewDirectory"可能类似于"$i/$j"

IHTH

答案 1 :(得分:1)

虽然我喜欢 awk 解决方案shelter,但 make 是另类选择。这是GNU make的一个版本:

SRC = $(wildcard chromosome*-*.bed)
TGT = $(sort $(shell echo $(SRC) | sed -E 's/-[0-9]+[.]bed/.bed/g'))

all: $(TGT)

$(TGT): $(SRC)
    cat $(subst .bed,-*.bed,$@) > $@~
    mv $@~ $@

echo: 
    @ls $(SRC)
    @echo targets: $(TGT)

以上所有目标都取决于每个来源,这显然是过度的。如果您有许多文件或经常更改,您可能希望生成正确的依赖项。

优点:

  • 可以通过以下方式重新生成特定文件: make chromosome2.bed
  • 如果没有更改或添加文件,则跳过重新生成。
  • 在不完全部分生成文件的情况下停止错误。

输出:

$ make
cat chromosome1-*.bed > chromosome1.bed~
mv chromosome1.bed~ chromosome1.bed
cat chromosome2-*.bed > chromosome2.bed~
mv chromosome2.bed~ chromosome2.bed

$ head  chromosome?.bed
==> chromosome1.bed <==
chromosome1     7   30
chromosome1     1   21
chromosome1     9   75

==> chromosome2.bed <==
chromosome2     8   50
chromosome2     6   23

答案 2 :(得分:0)

为什么不使用globbing?

cat chromosome1-* >> chromosome1.bed

cat chromosome2-* >> chromosome2.bed

chromosome2-*将选择以chromosome2-开头的所有文件,如果手动操作太多,可以将其放在每个索引的循环中。