awk / sedを使用して、アンダースコア文字までを印刷します


10

awkまたはsedを使用して、最初のアンダースコア文字までの文字列のみを出力するにはどうすればよいですか?

前:

host100_044 2
host101_045 2
host102_046 2

後:

host100
host101
host102

回答:


20

これはcut

cut -d _ -f 1

例えば

$ echo host100_044 2 | cut -d _ -f 1
host100

また、でawk行うことができますawk -F_ '{print $1}'(おそらくそれを行うよりきれいな方法があります)


@Renanカットの実行に加えてすべての入力情報を出力に含めるには、このカット関数をどのように変更しますか?
BioMan、2015

2

sedの別の代替:

echo 'host100_044 2' | sed 's/^\(.*\)_.*$/\1/'

これらがファイルにある場合は、次のように呼び出すことができます。

cat fileName | sed 's/^\(.*\)_.*$/\1/'

1
echo host100_044 2 host101_045 2 host102_046 2| sed 's/_/ /g' | awk 'BEGIN { RS="host"} {printf("host%s ", $1)}'  | cut -d ' ' -f2-

出力:

host100 host101 host102

改行付き:

echo host100_044 2 host101_045 2 host102_046 2| sed 's/_/ /g' | awk 'BEGIN { RS="host"} $1 ~ /[0-9]/ {print "host"$1}'

出力:

host100
host101
host102

1

使用sed

echo host100_044 2 | sed 's;_.*;;'


sedインプレイス編集オプション を使用して、

sed -i.old 's;_.*;;' infile

彼が尋ねたので、awkソリューションはすでに投稿されていますが(cutおそらくこの場合はおそらく最高です)、同じことを書いていただけsedですが、あなたは数秒で私を倒しました:-)。デフォルトで行末に$一致.*するため、を削除することもできます。
Daniel Andersson

@DanielAndersson:はい。
ジョンウェスリー王子

1
$ echo "host100_044 2" | awk -F'_' '{print $1}'
host100

-F'_'指示awkフィールドの区切り文字としてアンダースコアを使用します。awkスクリプト自体は、単に最初のフィールドを出力します。


弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.