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"