
私のテキストファイルに次のものが含まれているとしましょう。
101 Adam
201 Clarie
502 Adam
403 Tom
特定の名前に基づいて数字のみを提供するコマンドをシェルに書きたいと思います。たとえば、「Adam」という名前の数字だけを出力すると、次のようになります。
101
502
私は次のことを考えています:
cut -f 1 Data_1 | grep "Adam"
しかし、うまくいきません。 Data_1はファイル名です。 1 は最初の列を表します。私はUnixに初めて触れたので、これについてのフィードバックをいただきありがとうございます。
答え1
grep
次のオプションを使用すると、PerlツアーエクステンションでSingleを使用できます-P
。
grep -Po '.*(?=Adam)' file
これにより、Adamという単語まで1行の内容がすべて印刷されます。
スペースなどを除いて数字だけを希望する場合は、次の操作を行います。
grep -Po '[0-9]*(?=.*Adam)' file
答え2
awk
これにお勧め
- デフォルトの入力フィールド区切り文字は1つ以上の連続したスペースであるため、スペース/タブ区切りについて心配する必要はありません。
- 固定文字列を比較する方が簡単です(たとえば、正規表現のメタ文字に対する脆弱性が少ない - 引用符とバックスラッシュ文字を使用して文字列を構成するときは注意が必要です)。エスケープシーケンス)
$ cat ip.txt
101 Adam
201 Clarie
502 Adam
403 Tom
$ # check if 2nd column value is Adam (wont match MAdam, Adama, etc)
$ # use $NF instead of $2 to check against last column
$ awk '$2=="Adam"{print $1}' ip.txt
101
502
$ # using variable instead of string constant
$ awk -v name='Adam' '$2==name{print $1}' ip.txt
101
502
$ # passing shell variable
$ n='Tom'
$ awk -v name="$n" '$2==name{print $1}' ip.txt
403
答え3
まず、grep / cutを逆順に実行します。そして、これが列を区切る実際のタブ文字(たとえばTab不明)でない限り、通常のスペース(たとえば)を区切り文字として指定する必要がありますSpace。
grep Adam Data_1 | cut -f1 -d' '
タブを使用している場合は使用しないでください-d' '
。
通常、このような複合コマンドを作成するときは、一度に1つずつ試してください。一人で何かをするときに何を見ますかcut
?適用することが意味があると思いますかgrep
?そうでない場合は、もう一度考えてみてください。
そしていつもman
各コマンドのページをよくお読みください。
ボーナスsed
:同じ操作を実行するコマンドは次のとおりです。
sed -n 's/^\(.*\)\t\+Adam$/\1/p' Data_1
これは、ファイル内のすべての行を繰り返すが、1つ以上のタブと検索文字列で終わる行だけを印刷します。その後、印刷する前に同じタブと検索文字列を削除します。
答え4
Awkを使用する簡単な方法:
awk '/ Adam$/ {print $1}' file
101
502