我在同一目录中有以下五个文件(名称末尾.bed and start
染色体and have numbers such as
1-5`嵌入中间;显示一行内容或每个文件):< / p>
chromosome1 1 21
chromosome1 7 30
chromosome1 9 75
chromosome2 8 50
chromosome2 6 23
我尝试捕获文件,这些文件以相同的编号开头于一个文件(因此1
中的所有文件都带有前导1-5
等。
预期输出:
chromosome1 1 21
chromosome1 7 30
chromosome1 9 75
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
答案 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-开头的所有文件,如果手动操作太多,可以将其放在每个索引的循环中。