0

シェルスクリプトを使用して、テキストファイルから単語を読み取り、次の列の単語を返します。

たとえば、私の入力ファイルは次のようになります

AGE1 PERSON1
AGE2 PERSON2
AGE3 PERSON3
AGE4 PERSON4

ShファイルにPERSONの名前の変数があります。入力テキストファイルを読んで、人の年齢の値を取得したい。

助けてください、私はシェルスクリプトの初心者です

4

3 に答える 3

1

少し簡単な解決策は次のとおりです。

age=$( awk '$2==name { print $1 }' name="$name" input-file )
于 2012-10-08T16:16:38.880 に答える
0

Shellterのコメントに基づいて構築:

age=$(grep "$person_name" people_file.txt | cut -f1 -d' ')

私はすべてを説明しようとします。まず、私は何かを想定しています(ただし、スクリプトで変更できます)。

  1. 入力したデータを含むファイルはと呼ばれpeople_file.txtます。
  2. 検索する人の名前は変数にあります$person_name
  3. 結果を保存する変数はです$age

まず、コマンドを使用して$age変数の値を生成する必要があるため、コマンド(または一連のコマンド)を使用$()て実行し、コマンド(または複数のコマンド)の実行からキャプチャしたテキストに置き換える必要があります。

まず、その人の名前を含む行を見つける必要があります。そのためにgrepを使用します:grep regex file。Grepはfile、正規表現に一致する行が見つかるまで、行ごとに検索しますregex。この場合、人の名前を直接検索できます(ピリオドやアスタリスクなどの特殊文字が含まれていない場合)。変数を二重引用符で囲む必要があることに注意してください。そうしないと、スペースを含む人の名前がコマンドラインで分割され、その名が正規表現として使用され、名前がファイルとして使用される可能性があります。大文字と小文字を区別しない方法で検索する場合(たとえば、JohnはJOHNまたはjohnの行を検索します)、-iフラグを使用できます。grep -i regex file。選択した行はgrepによって出力に出力されますが、これらの行をパイプ演算子を使用して次のコマンドの入力に送り|ます。

最後に、結果を含む1行(または複数行)があります。今、私たちは年齢を抽出する必要があります。cutコマンドは、入力から読み取った各行をフィールドに分割し、要求されたフィールドのみを出力します。この場合、-f1オプション付きの最初のフィールドを要求します。また、コマンドを使用して、スペース文字を区切り文字(つまり、フィールドを区切る文字)として使用するように指定します-d1

同じ人の名前の行が複数ある場合は、grepの出力をheadコマンドにパイプする必要があります。これにより、必要な行数だけを取得できます。オプションを使用して、必要な行数を頭に伝えることができ-n Nます。したがって、最初の一致のみが必要な場合:

age=$(grep "$person_name" people_file.txt | head -n 1 | cut -f1 -d' ')

これが少し役立つことを願っています=)

于 2012-10-02T17:33:17.673 に答える
0
age=`
   perl -nle'
      BEGIN { $n = shift(@ARGV); }
      print $1 if /^(\S+)\s+\Q$n\E$/;
   ' "$name" file
`

モードbashでテスト済み。sh

于 2012-10-02T16:20:45.433 に答える