ファイル名の一部抽出

ファイル名の一部抽出

TRNPRD.STD.BSRE.BREX.J.20190520.V02.PRET私のLinuxシステムにファイル名があり、そのファイル名を抽出するだけですTRNPRD.STD.BSRE

次のコマンドを試しました。

echo TRNPRD.STD.BSRE.BREX.J.20190520.V02.PRET | awk -F'.' '{for(i=0;++i<=NF-5;) printf $i".";}'

しかし、目的の結果を返し、最後に不要な追加の点があります。

TRNPRD.STD.BSRE.

ここで何を見逃しているのか教えてくれる人はいますか?

答え1

これは少し過剰なので、cutここで使用することをお勧めします。awk

$ echo TRNPRD.STD.BSRE.BREX.J.20190520.V02.PRET | cut -d . -f -3
TRNPRD.STD.BSRE

答え2

印刷してから追加するように指示したため、コマンドがawk追加されます。したがって、 extra で始まります。.$i..

$ echo TRNPRD.STD.BSRE.BREX.J.20190520.V02.PRET | 
    awk -F'.' '{for(i=0;++i<=NF-6;) printf $i"."; print $(NF-5)}'
TRNPRD.STD.BSRE

または、最初の3つを直接印刷します。

$ echo TRNPRD.STD.BSRE.BREX.J.20190520.V02.PRET | 
    grep -oP '^([^.]+\.){2}[^.]+'
TRNPRD.STD.BSRE

もちろん、元の方法を使用して重複項目を削除することもできます.

$ echo TRNPRD.STD.BSRE.BREX.J.20190520.V02.PRET | 
    awk -F'.' '{for(i=0;++i<=NF- 5;) printf $i".";}' | sed 's/\.$//'
TRNPRD.STD.BSRE$ 

しかし、最良かつ簡単な解決策はcut @Pankiが提案したように

答え3

文字列からドットで区切られた最後の5つの部分文字列を削除するには、次のようにします。

$ name=TRNPRD.STD.BSRE.BREX.J.20190520.V02.PRET
$ echo "${name%.*.*.*.*.*}"
TRNPRD.STD.BSRE

これが適用されます標準パラメータ拡張値の末尾から、指定されたパターンに一致する部分文字列を削除します$name


欲しいなら維持する文字列からドットで区切られた最初の3つの部分文字列:

$ name=TRNPRD.STD.BSRE.BREX.J.20190520.V02.PRET
$ echo "${name%.${name#*.*.*.}}"
TRNPRD.STD.BSRE

$name最初に使用${name#*.*.*.}#左から削除/開始、%右から削除/終了)から最初の3桁の数字を削除し、結果を使用して文字列の尾を削除し、最初の3つの点で区切られたビットを残します。


$name次の提案は、inの値に改行文字が含まれていない限り機能します(標準のテキスト処理ツールを使用するすべてのソリューションで問題となります)。

コードawkは常に各フィールドの末尾に点を印刷します。少し強力にするには、次のようなものを使用できます。

awk -v OFS="." '{ n=split($0,a,"\."); $0=""; for (i=1; i<=3 && i<=n; ++i) $i=a[i]; print }' <<<"$name"

値をポイントに分割し、値の最初の3つの部分の出力レコードを作成して印刷します(出力フィールド区切り記号、OFSポイントとして設定)。

最初の3ビットを保持するのではなく、最後の5ビットを削除するには、次の手順を実行します。

awk -v OFS="." '{ n=split($0,a,"\."); $0=""; for (i=1; i<=n-5; ++i) $i=a[i]; print }' <<<"$name"

関連情報