ディレクトリ内のすべてのファイルから特定のサフィックスを削除する

ディレクトリ内のすべてのファイルから特定のサフィックスを削除する

以下を使用して2000を超える5K SNPファイルに分割された遺伝子型ファイルがあります。

split -d geno_file

私が得た結果は次のとおりです。

table_subset_0001
table_subset_0002
table_subset_0003
.
.
table_subset_0099
.
.
table_subset_0999

ゼロを削除して取得したいです。

table_subset_1
table_subset_2
table_subset_3
.
.
table_subset_93
.
.
table_subset_999

これを行う方法はありますか?

答え1

Perlユーティリティの使用rename:

rename 's/_0+/_/' table_subset_*

これにより、_次の0文字がに置き換えられます_

上記はrenamePerlに付属のユーティリティ(時々呼び出される)と連携して動作します。prename一部のディストリビューションは、完全に互換性のないユーティリティrenameからユーティリティをインストールしますutil-linux

Perlの名前変更がシステムにまだインストールされていない場合は、それをインストールする方法を見つけることができます。ここ

答え2

純粋さのために...

純粋なbash答え:(@ steeldriverに感謝します)

shopt -s extglob
for file in table_subset_0*; do
    mv "$file" "${file/_+(0)/_}"
done

純粋なGNUのsed答え:

ls | sed -n -r '
    /^(table_subset_)0+(.*)/ ! d
    s//mv & \1\2/
    e
'

純粋なGNUのawk答え:

ls | awk -F '_0+' 'NF > 1 { system("mv " $0 " " $1 "_" $2) }'

答え3

@John1024のソリューションに追加するために標準のBashコマンドを使用する同様のソリューションがあります。

for file in table_subset_*; do
    new_name=$(echo "$file" | sed -E -e 's/_0+/_/')
    mv "$file" "$new_name"
done

原理は同じです。すべてのファイルを繰り返し_0_

答え4

まず、他のツールをawk使用して実行する代わりに使用できます。splitrename

awk 'NR%5000==1{ file=sprintf("table_subset_%d", ((++c)) )} {print >file}' geno_file

これにより、ファイルは前にゼロのない数字のサフィックスを持つ5Kファイルチャンクに分割されますが、上記の4ビット長をgeno_file自由に使用できます。0Xdsprintf("..._%04d", ((++c)) )

geno_fileまたは、出力ファイルを9つの部分に分割する場合は、最初に適切なオプションを使用してsplit1(デフォルトは0)から始まる数字のサフィックスを設定し-a N(長さN(デフォルトは2)のサフィックスを生成)、単に次のように使用できます。あります。

split -a 1 --numeric-suffixes=1 -l TOTALLINES/9HERE table_subset_

awkしかし、まだ解決策を忘れないでください。

関連情報