bashでファイル名の一部である数値を変数として保存する方法

bashでファイル名の一部である数値を変数として保存する方法

ループを介して一度に複数のファイルを変更して名前を変更できるように、ファイル名の一部である数値を変数として保存しようとしています。ファイル名は Trimmed-barcode*.1.fastq.gz です。ここで * は変数の 2 桁または 3 桁の数字で、これを num として保存しようとします。これにより、$num に先に定義した $number 変数を乗算し、乗算された数字で各ファイルの名前を変更することができます (ただし、今は echo でテストしています)。ファイル名に2桁または3桁の数字を保存する方法は?

for infile in trimmed-barcode*.1.fastq.gz
  do num= #how do I get this number
  num2=$(($num * $number))
  echo "trimmed-barcode${num2}.1.fastq.gz"
  done

ベストアンサー1

スクリプトを使用すると、bash文字列から2つの数字を抽出できます。例えば

var="abcdefg"
echo "${var:3:2}"    # Outputs "de"

これにより、スクリプトを次のように調整できます。

#!/bin/bash
for infile in trimmed-barcode??.1.fastq.gz
do
    num="${infile:15:2}"    # Two characters starting at position 15
    result=$(( ${num#0} * number ))
    echo "trimmed-barcode$result.1.fastq.gz"
done

$numを掛けるときは、$number値から前のゼロを削除してbash8進数で処理しないようにする必要があります。それだけです${num#0}


両方を要求するように質問を修正しました。または3数字。これは実装を大幅に変更します。

  1. ループを繰り返すことはできますが、今回は3つの数字が一致します。

    for infile in trimmed-barcode??.1.fastq.gz
    do
        # Code as above for two digit extracts
    done
    
    for infile in trimmed-barcode???.1.fastq.gz
    do
        # Modify code as above to process three digit values
    done
    
  2. 残りの部分が興味のある値でなければならないと仮定し、変更されていない部分を削除するようにコードを変更できます。

    for infile in trimmed-barcode*.1.fastq.gz
    do
        num=${infile#trimmed-barcode}    # Strip leading text
        num=${num%.1.fastq.gz}           # Strip trailing text
        result=$(( ${num#0} * number ))
        echo "trimmed-barcode$result.1.fastq.gz"
    done
    

おすすめ記事