我有几个文件,如下所示:
1_150901_AC7GLHANXX_P2258_101_1.fastq.gz
1_150901_AC7GLHANXX_P2258_101_2.fastq.gz
2_150901_AC7GLHANXX_P2258_101_1.fastq.gz
2_150901_AC7GLHANXX_P2258_101_2.fastq.gz
...即,有两个文件以1_
开头,以_1.fastq.gz
或_2.fastq.gz
结尾,两个以2_
开头的文件相同。我想要做的是cat
以_1.fastq.gz
结尾的两个文件,如下所示:
cat 1_150901_AC7GLHANXX_P2258_101_1.fastq.gz \
2_150901_AC7GLHANXX_P2258_101_1.fastq.gz \
> 150901_AC7GLHANXX_P2258_101_1.fastq.gz
...以便合并它们并删除它们的前缀。我有比这更多的文件夹中的文件,所以我想自动化它。我尝试了以下代码,但无济于事:
for f in *_*_1.fastq.gz
do
cat $f "${f/^1_/2_}" > "${f/^1_/}"
done
我认为我不太了解这种替代方法,但它是我过去用于较不复杂的文件名的(当它们只有不同的sufficex,没有前缀时)。我认为开头的^
表示文件名的开头,但它似乎并不像我想要的那样工作,所以显然我做错了。我尝试了一些故障排除:
for f in *_*_1.fastq.gz
do
echo "${f/^1_/}"
done
...给我......
1_150901_AC7GLHANXX_P2258_101_1.fastq.gz
2_150901_AC7GLHANXX_P2258_101_1.fastq.gz
......这不是我想的那样。有谁知道我怎么能这样做?
[编辑,澄清非重复的问题]
这个问题与我之前的问题不同,我的文件名也有一个前缀,该前缀也存在于文件名的中间。另一个问题有一个更简单的情况,只有一个后缀才需要重命名。
答案 0 :(得分:2)
找到" 1"然后检查" 2" s 如果它们都在一起并删除它们。
for f in 1_*_1.fastq.gz
do
g="2_${f#1_}"
if [ -f "$g" ]
then
cat "$f" "$g" > "${f#1_}" && rm "$f" "$g"
fi
done
答案 1 :(得分:0)
如果我在我们的位置,假设目录中只有这种格式的文件,我会选择这样的程序:
$ ls | cut -b3- | sort -u | tee stems.lst # list the stems
$ while read stem; do cat *_$stem > $stem; done <stems.lst
在你上线之前在测试目录中试试这个,否则你会弄乱文件名,恢复会很痛苦。
结束说明:
while
命令更安全,通过运行某种形式的echo "cat *_$stem > $stem"
,然后再替换它真实的东西。stem.lst
sort -u
到while
$stem
行中的while
行的ALL
附近加双引号