この問題にご協力いただきありがとうございます。次の形式のテキストファイルがあります。
名前は常に3文字、職業は7文字、給与は5文字と仮定しても構いません。変数は、パラメータではなくユーザー入力から来ます。
BobJanitor20000
TedBuilder30000
NedFighter25000
KitTeacher40000
ジョブまたは給与を表示するかどうかをユーザーに名前とは異なる入力を入力するように依頼します。
ユーザーが「Ted」と入力して給与を選択した場合、出力は次のようになります。
Ted 30000
プログラムは部分的な名前一致も考慮し、「ed」と給与を出力する必要があります。
Ted 30000
Ned 25000
私は関連する行を知って提供cut
できgrep
ますが、希望の出力をどのように生成しますか?
答え1
$ grep -F ed file|fold -w 5|fold -w 3|grep -E '^[[:upper:]]..|^[0-9]'|paste -sd ' \0\n' -
Ted 30000
Ned 25000
または:
$ cut -c 1-3,11- file | grep -F ed | fold -w 3 | paste -sd ' \0\n' -
Ted 30000
Ned 25000
または(GNU仮定grep
):
$ grep -oE '^.{3}|.{5}$' file | paste -sd ' \n' - | grep -F ed
Ted 30000
Ned 25000
次のこともできます(シェルにプロセス代替サポートがあると仮定)。
separate() {
fold -w 1 -- "$@" |
paste -sd '\0\0 \0\0\0\0\0\0 \0\0\0\0\n' - |
sort -k 1,1
}
join <(separate file | cut -d ' ' -f 1 | grep -F ed
) <(separate file) | cut -d ' ' -f 1,3
答え2
名前検索スクリプトです。私ここのドキュメント(別名heredoc)は、外部ファイルの代わりにリストをwhileループに渡し、読みやすくするためにそのファイル内にすべてを含めることを可能にします。必要に応じて延長できます。
man bash
について読む組み込みコマンド、(太字で表示された内容をマニュアルで検索してください)私が使っているのは、
- 部分文字列拡張ラインのさまざまな部分を取得する
- 正規表現一致するものが見つかりました。 =~
- [[[...]] は次を返します。ホームフレーズ値(0または1)は内部式によって異なります。
スクリプトは次のとおりです。
read -p "Input Name: " SearchName
while read line
do
Name=${line:0:3}
Job=${line:3:7}
Salary=${line:10:5}
[[ $Name =~ $SearchName ]] && echo $Name $Salary
done << "end--"
BobJanitor20000
TedBuilder30000
NedFighter25000
end--
user@machine:~/tmp$ bash manipvar.sh
Input Name: ed
Ted 30000
Ned 25000
user@machine:~/tmp$
答え3
区切りは大文字に基づいていると仮定します。
SEDとともに
名前+給与
sed -e "/${NamePart}.*[A-Z].*/ !d" -e 's/\([A-Z][a-z]*\)[A-Z][a-z]*\([0-9]*\)/\1 \2/' YourData.file
名前+職業
sed -e "/${NamePart}.*[A-Z].*/ !d" -e 's/\([A-Z][a-z]*\)\([A-Z][a-z]*\)[0-9]*/\1 \2/' YourData.file
答え4
これは私にとって効果的です
$ echo `grep -oe '^...\|[0-9]\{5\}' filename` | grep -oe '.\{9,10\}$\?' | grep ed
Ted 30000
Ned 25000