ファイル名から数値を抽出

ファイル名から数値を抽出

このモデルに従うファイル名があります。

 1.raw_bank_details_211.trg
 2.raw_bank_details_222.trg

Unixでコマンドを使用しcut、上記の文字列を切り取り、文字列から211 値を取得して値をエコーする必要があります。222

grepを使用しましたが、grep -o -E '[0-9]+'代替が必要です。

ベストアンサー1

cut.

以下はいくつかの方法です。


2番目のフィールドを使用、インポート、または分離awk_ます。.

awk -F '[_.]' '{print $(NF-1)}' file.txt

grepPCRE( -P) 使用:

grep -Po '\d+(?=[^_]*$)' file.txt
  • -o一致する部分のみを取得する

  • \d+1 つ以上の数値の一致

  • 幅0のポジティブプレビューは、行末までのフォローアップを(?=[^_]*$)保証しません。_


そしてsed

sed -E 's/.*_([[:digit:]]+).*/\1/' file.txt
  • .*_結局はすべて一致する_

  • ([[:digit:]]+)必要な数字を一致させてキャプチャグループに入れます。

  • .*残りも一致させてください

  • 交換時には\1キャプチャされたグループのみが使用され、


の場合、以下perlと同じ論理ですsed

perl -pe 's/.*_(\d+).*/$1/' file.txt 

必ず使用する必要がある場合は、cut2つのステップで実行してください。最初に_分離された4番目のフィールドをインポートし、次に分離された1.番目のフィールドをインポートします。

cut -d_ -f4 file.txt | cut -d. -f1

フィールド番号をハードコードする必要があるため、お勧めできません。


文字列の場合は、シェルパラメータ拡張を使用して実行します。

% str='1.raw_bank_details_211.trg'

% str=${str##*_} 

% echo "${str%%.*}"
211

それでもwhile構文を使用し、各行を変数に入れてそれを行うことができますが、大容量ファイルでは速度が遅くなります。または、必要に_.応じてasを使用してハードコードされたフィールド(たとえば)をインポートすることもできます。IFScut


例:

% cat file.txt                          
1.raw_bank_details_211.trg
2.raw_bank_details_222.trg

% awk -F '[_.]' '{print $(NF-1)}' file.txt
211
222

% grep -Po '\d+(?=[^_]*$)' file.txt         
211
222

% sed -E 's/.*_([[:digit:]]+).*/\1/' file.txt
211
222

% perl -pe 's/.*_(\d+).*/$1/' file.txt 
211
222

% cut -d_ -f4 file.txt | cut -d. -f1
211
222

おすすめ記事