シェルスクリプトを使用して、テキストファイルから単語を読み取り、次の列の単語を返します。
たとえば、私の入力ファイルは次のようになります
AGE1 PERSON1
AGE2 PERSON2
AGE3 PERSON3
AGE4 PERSON4
ShファイルにPERSONの名前の変数があります。入力テキストファイルを読んで、人の年齢の値を取得したい。
助けてください、私はシェルスクリプトの初心者です
少し簡単な解決策は次のとおりです。
age=$( awk '$2==name { print $1 }' name="$name" input-file )
Shellterのコメントに基づいて構築:
age=$(grep "$person_name" people_file.txt | cut -f1 -d' ')
私はすべてを説明しようとします。まず、私は何かを想定しています(ただし、スクリプトで変更できます)。
people_file.txt
ます。$person_name
。$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' ')
これが少し役立つことを願っています=)
age=`
perl -nle'
BEGIN { $n = shift(@ARGV); }
print $1 if /^(\S+)\s+\Q$n\E$/;
' "$name" file
`
モードbash
でテスト済み。sh