web-dev-qa-db-ja.com

特定の単語の後に値を取得する

このファイルがあります

1 deiauk David Smith from California 12 58
2 edvin from Nevada 12 5 8 95 2 48 5
3 jaco My Name Is Jacob I'm from NY 5  6  845 156 585
4 from Miami

そして、私は特定のWord fromの後に値を取得する必要がありますか?シェルでそれを行うことは可能ですか?私の出力は

California
Nevada
NY
Miami
6
user3334375

または

awk '{for (I=1;I<=NF;I++) if ($I == "from") {print $(I+1)};}' file

7
user1174838

grepを使用すると、次のように実行できます。

grep -oP "from\s+\K\w+" input.txt

ここに、

-o  ==>  option for printing only the matching part of the line
-P  ==>  use Perl-regexp
\K  ==>  do not print that comes before \K (zero-width look-behind assertion)
\w  ==>  match Word characters
15
shivams

読みやすいソリューションは次のとおりです。

awk -F '${fixed_string}' '{print $2}' file | awk '{print $1}'

それがすること:

  • -F '${fixed_string}'は、入力を指定された文字列の前後に分離します。したがって、ファイルで、fixed_string='from'print $2は次のようになります:

    California 12 58 Nevada 12 5 8 95 2 48 5 NY 5 6 845 156 585 Miami

  • 必要なのは、この入力の最初の列だけです。したがって、最初のawkの出力をawkにパイプして、最初の列を出力します。

6
Jignesh Darji

このsedの1つのライナーがそれを行います。

 sed '/from/s/.*from \([^ ][^ ]*\)[ ]*.*/\1/' input

「from」リテラル文字列の前にスペース文字があると想定しています。タブで区切られたフィールドが必要な場合、 '['と ']'の間の3つの文字範囲一致式すべてにタブ文字を挿入する必要がある場合があります。

1
Bruce Ediger

ファイル名がtest.txtであると想定します

$ cat test.txt
deiauk David Smith from California 12 58
edvin from Nevada 12 5 8 95 2 48 5
jaco My Name Is Jacob I'm from NY 5  6  845 156 585
from Miami

sedを使用してfromの後にすべてをgrepし、次にcutのように出力することができます。

$ cat test.txt | sed 's/.*from //' | cut -d " " -f 1
California
Nevada
NY
Miami
0
y.kashyap007