2016-08-29 7 views
4

含めて、私は例えば、ファイル拡張子および接尾辞の両方を削除し、ファイル名を捕獲しようとしてる試合まで抽出していない:正規表現 - その試合

TEST_EXAMPLE_SUFFIX.file 
Output = TEST_EXAMPLE 

私はマッチングに基づいてこれをやりたいです_SUFFIX部分を削除し、それ以前のすべての文字を抽出します(_SUFFIXを除く)。

for t in $(ls *.fastq | sed -e /.+?(?=$READ1_EXT)/) 

私はエラーを取得する:

command substitution: line 14: syntax error near unexpected token `(' 

は、私が何をした、一緒forループの一部として、配管はしかし

FILE_EXT=_SUFFIX 
/.+?(?=$FILE_EXT)/ 

:通常、私のようなものを使用します違う?

答えて

5

ls出力を解析しないでください、あなたは

for t in *_SUFFIX.fastq 
do 
    echo "${t%_SUFFIX.fastq}" #stips _SUFFIX.fastq part 
done 

参照


編集:作業の周りに繰り返し出現するため

、あなたはこのような何かを行うことができます:

はあなたが興味の二つのファイルTest_R1.file & Test_R2.fileを持っていて、Testを期待していることを考えてみましょう結果に1回しか表示されないようにする

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 
+0

ありがとう!興味のない場合、この問題は、|ユニットは通常同じファイル名を持つ複数のファイルが存在するが、一意のインスタンスだけを反復したいのでループラインに追加されましたか? – AnnaSchumann

+0

@AnnaSchumann:まず、単一のディレクトリに、あなたがすでに認識しているように、同じファイル名を持つ複数のファイルを持つことはできません。あなたはサブディレクトリ内のファイルを探すことを意図しましたか? – sjsam

+0

明快さに欠けて申し訳ありません。すべてのファイルがペアになっていて、Test_R1.fileやTest_R2.fileのような接尾辞_R1と_R2のためにのみ異なっているとしましょう。私は "テスト"パートを一度取りたいだけですが、通常のループでは2回表示されます。通常は、Rev、cut、uniqを使ってループラインで "Test"を取得しますが、接尾辞が変更された場合は非常に柔軟性がありません。 – AnnaSchumann

1

あなたは、ファイル名の永続的な形式を想定し、これだけ使ってbashパラメータ展開を行うことができます。

for file in *_SUFFIX.fastq; do echo "${file%_*}"; done 

for構造の反復.fastq以上のファイルを。

例:

$ file=TEST_EXAMPLE_SUFFIX.fastq 

$ echo "${file%_*}" 
TEST_EXAMPLE 
+0

forループで '* _SUFFIX.fastq'を使用しない場合、' echo "$ {file%_SUFFIX.fastq}" ' – sjsam

+1

@sjsamが必要な場合があります。私はOPの例を文字通り...と解釈しました。 ..おまけ – heemayl