1

我正在编写一个程序,它将获取数据字段来创建用户名和密码

这是数据的格式

MWS1990 XXX-XX-XXXX STASNY, MATTHEW W SO-II BISS CPSC BS   INFO TECH   412/882-0581

这是程序

for linePosition in {11..22}
do
  holder=`sed -n "${linePosition}p" $1|awk '{print $1}'`
  holder2=`sed -n "${linePosition}p" $1|awk '{print $12}'`
  holder3=`sed -n "${linePosition}p" $1|awk '{print $7}'`
  echo "UserName"
  echo "$holder"
  echo "password"
  echo "$holder2"
  echo "$holder3"
done

它返回这样的输出

UserName
MWS1990
password
412/882-0581
BISS

有两件事是错误的

  1. 我希望它删除用户名后的一年。所以上面的例子只是 MWS。我可以添加什么到holder=`sed -n "${linePosition}p" $1|awk '{print $1}'以使其仅返回前 3 个字母。(最好是小写但不是必须的)

  2. 我想删除电话号码的前 6 个字母。 所以电话号码不是412/882-0581 ,而是 0581

4

3 回答 3

3

既然你已经使用了awk,你可以减少涉及的命令

awk 'NR >= 11 && NR <= 22 {
    print "UserName";
    print tolower(substr($1, 1, 3));
    print "password";
    print substr($12, 9);
    print $7;}' $1
于 2013-02-17T22:45:56.167 回答
2

如果您使用 Bash,则可以使用 Bash子字符串提取轻松完成这两件事(另请参见此处)。

换句话说,类似:

echo ${holder2:0:3} # "MWS"
echo ${holder3:8:12} # "0581"

# Or, to begin indexing from the right end:

echo ${holder3:(-4)} # "0581"

至于在 Bash 中将字符串转换为小写,请参见例如 ghostdog74 的答案

于 2013-02-17T22:31:43.447 回答
2

所以这是一个修改后的答案

for linePosition in {11..22}
do
  holder=`sed -n "${linePosition}p" $1|awk '{print $1}'`
  holder2=`sed -n "${linePosition}p" $1|awk '{print $12}'`
  holder3=`sed -n "${linePosition}p" $1|awk '{print $7}'`
  echo "UserName"
  echo `expr match "$holder" '\([A-Z|a-z]*\)'`
  echo "password"
  echo ${holder2: -4}
  echo "$holder3"
done

现在我坚持使用我在评论中发布的链接中描述的 bash 字符串替换。

但是,我想指出以下有关此解决方案的警告

这是对以下 bash 脚本行的快速描述...

`expr match "$holder" '\([A-Z|a-z]*\)'`

反引号在您的 for 循环中执行一个子 shellexpr ,它们运行传递的命令, match其中返回与字符串开头的$holder正则表达式匹配的字符串部分。[A-Z|a-z]*参考http://tldp.org/LDP/abs/html/string-manipulation.html

现在,如果您的数据文件不是太长,那么就可以了。

但是,如果您的脚本必须处理大型数据文件,那么我建议您查看 Olaf 的解决方案。

为什么?

如果您正在处理一个大文件,或者如果您不知道脚本要处理的文件的大小,那么最好避免在 for 循环中执行子 shell 。

Olaf 利用awk来执行您需要的处理的解决方案具有一个重要优势,因为所有工作都在单个进程中进行而 for 循环为文件的每一行分叉和执行一个新的 bash 实例。一种昂贵的操作,当放置在 for 循环中时可能会有风险。

对于您的代码,我们可以看到当前 for 循环由一小组行绑定,但如果这曾经被更改或在 for 循环中引入了一个错误,导致它永远运行,那么脚本可能会对您的机器的性能产生不利影响。

因此,尽管我的回答可能更容易适应您的代码。如果您必须处理大量数据,Olaf 的答案会更好。

于 2013-02-17T22:43:05.603 回答