无需 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

相关内容