awkやsedなしで文字列を操作する

awkやsedなしで文字列を操作する

この問題にご協力いただきありがとうございます。次の形式のテキストファイルがあります。

名前は常に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

関連情報