0

わかりました、バージョン番号 v1 または v2 をすべて含むファイルがたくさんあります。そして、次のように2番目のファイルとして構成されている他のファイルにファイル名を一致させたい:train.v1_GENENAME_ID.debruijn.txt(これは私が欲しいものです)

最初のファイルは次のように構成されています: train.GENENAME_ID_v1.debruijn.txt

したがって、v1 は GENENAME の前に移動する必要があります。バージョン識別子はすべて同じです。すなわちv1またはv2

'train.Glis2_1757.2_v1_deBruijn.txt'というファイルがあり、それをこれに変換したいとしましょう'train.v1_Glis2_1757.2_deBruijn.txt'

最初のファイル名から v1 を取得し、2 番目のファイル名のように配置する簡単な方法はありますか?

grep と if ステートメントを組み合わせることを考えていました。しかし、まだそれを機能させることはできませんでした。

ヒント/ヒントをいただければ幸いです。

4

3 に答える 3

1

パラメータ展開を使用してシェルでこれを行うことができます。具体的には、サフィックスとプレフィックスを削除します。

FN=train.Glis2_1757.2_v1_deBruijn.txt
STRIPPED=${FN%_deBruijn.txt}                      # "train.Glis2_1757.2_v1"
GENEVERS=${STRIPPED#train.}                       # "Glis2_1757.2_v1"
VERSION=${GENEVERS##*_}                           # "v1"
GENENAME=${GENEVERS%_v[12]}                       # "Glis2_1757.2"

NEWFN=train.${VERSION}_${GENENAME}_deBruijn.txt   # "train.v1_Glis2_1757.2_deBruijn.txt"

mv $FN $NEWFN

上記の明示的な命名手順をすべて実行する必要はありませんが、その方が明確だと思います。また、この手法は、シェル パターン表記で表現できると仮定して、任意の接頭辞 (「train.」以外) と接尾辞 (「_deBruijn.txt」以外) を持つように推定できます。

于 2013-04-22T14:51:09.327 に答える
1

これは for ループを使用sedし、ファイル名を変換するために使用するものです

for f in *.txt;
do
    nf=$(echo $f | sed -r 's/([^.]+\.)([^.]+\.)([0-9])_([^_]+)(.*)/\1\4_\2\3\5/')
    echo mv $f $nf
done

結果に満足したら、削除echoして名前を変更できます

あなたのリクエストに応じて、さまざまな部分がどのように抽出され、目的の出力に合うように再配置されるかを説明する注釈付きバージョンがここにあります

echo "train.Glis2_1757.2_v1_deBruijn.txt" | sed -r 
's/([^.]+\.) # match all non-dot characters (+ meaning one or more) followed by a dot and store in group 1 (train.)
   ([^.]+\.) # match all non-dot characters followed by a dot and store in group 2 (Glis2_1757.)
   ([0-9])   # match a single digit and store in group 3 (2)
   _         
   ([^_]+)   # match all non-underscore characters and store in group 4 (v1)
   (.*)      # match all that follow . is a wildcard char in regex and * is for zero or more (_deBruijn.txt)
/\1\4_\2\3\5/' # rearranging the matches to get desired output
于 2013-04-22T14:36:33.413 に答える