シェルスクリプトで文字列の最初の2文字を抽出するにはどうすればいいですか? 質問する

シェルスクリプトで文字列の最初の2文字を抽出するにはどうすればいいですか? 質問する

たとえば、次の場合:

USCAGoleta9311734.5021-120.1287855805

抽出したいのは次の部分だけです:

US

ベストアンサー1

bashおそらく、シェルを使用している場合 (コメントによると、そう思われます)、最も効率的な方法は、パラメータ展開のサブ文字列バリアントを使用することです。

pax> long="USCAGol.blah.blah.blah"
pax> short="${long:0:2}" ; echo "${short}"
US

shortこれはの最初の 2 文字に設定されますlong。 がlong2 文字より短い場合は、shortはそれと同一になります。

このシェル内メソッドは、プロセス作成のオーバーヘッドがないため、頻繁に実行する場合 (おっしゃるとおり、レポートごとに 50,000 回など) に適しています。外部プログラムを使用するすべてのソリューションでは、そのオーバーヘッドの影響を受けます。

もしあなたが、最小長さを短くしたい場合は、次のようにして事前に埋めることができます。

pax> long="A"
pax> tmpstr="${long}.."
pax> short="${tmpstr:0:2}" ; echo "${short}"
A.

これにより、長さが 2 文字未満の場合、右側にピリオド (または、 の作成時に使用する文字を変更するだけで、他の文字tmpstr) が埋め込まれるようになります。これが必要であるかどうかは明らかではありませんが、完全性のために追加しておこうと思いました。


そうは言っても、外部プログラムを使用してこれを行う方法は数多くあります (たとえば、外部プログラムが利用できない場合bash)。その一部を以下に示します。

short=$(echo "${long}" | cut -c1-2)
short=$(echo "${long}" | head -c2)
short=$(echo "${long}" | awk '{print substr ($0, 0, 2)}'
short=$(echo "${long}" | sed 's/^\(..\).*/\1/')

最初の2つ(cuthead)は、単一行の文字列では同じです。基本的にどちらも最初の2文字を返すだけです。違いは、 はcut各行の最初の2文字を返すのに対し、headは入力全体の最初の2文字を返す点です。

3 番目は、awkサブ文字列関数を使用して最初の 2 文字を抽出し、4 番目はsedキャプチャ グループ (およびを使用())を使用し\1て最初の 2 文字をキャプチャし、行全体をそれらで置き換えます。どちらも に似ておりcut、入力の各行の最初の 2 文字を渡します。

入力が 1 行であることが確実な場合は、どれも問題にはなりません。すべて同じ効果があります。

おすすめ記事