我尝试捕获同时删除文件扩展名和后缀的文件名,例如:
TEST_EXAMPLE_SUFFIX.file
Output = TEST_EXAMPLE
我想在匹配_SUFFIX部分并提取之前的所有字符(不包括_SUFFIX)的基础上这样做。通常我会使用类似的东西:
FILE_EXT=_SUFFIX
/.+?(?=$FILE_EXT)/
然而,当将它们作为for循环的一部分组合在一起时:
for t in $(ls *.fastq | sed -e /.+?(?=$READ1_EXT)/)
我收到错误:
command substitution: line 14: syntax error near unexpected token `('
我做错了什么?
答案 0 :(得分:5)
不解析ls
输出,您可以使用bash参数扩展
实现您的需求
for t in *_SUFFIX.fastq
do
echo "${t%_SUFFIX.fastq}" #stips _SUFFIX.fastq part
done
<强>参考强>
修改强>
为了解决重复发生的问题,你可以这样做:
考虑您有两个感兴趣的文件Test_R1.file
&amp; Test_R2.file
并且您希望Test
只在结果中出现一次,例如
declare -A arry # declaring an associative array
for t in Test_R*.file
do
arry["${t%_R*.file}"]=1
# stips _R(number).file part and makes it a key to arry
# Remember arry keys are unique.
# The assignment ie '=1' is not relevant here, you can assign any value
done
# We are all set to print the unique filenames
echo "${!arry[@]}"
# "${!arry[@]}" expands to the list of array indices (keys) for arry
答案 1 :(得分:1)
您可以使用bash
参数扩展来执行此操作,假设文件名的持久格式为:
for file in *_SUFFIX.fastq; do echo "${file%_*}"; done
for
构造迭代.fastq
个文件。
示例:强>
$ file=TEST_EXAMPLE_SUFFIX.fastq
$ echo "${file%_*}"
TEST_EXAMPLE