unix 如何在文件中使用多个变量并在命令中使用它

mwngjboj  于 2023-10-18  发布在  Unix
关注(0)|答案(1)|浏览(136)

我需要帮助在写一个脚本在巴什。
基本上我有一个文件,其中包含组名称和组成员
文件的eq
组1
会员1
会员2
组2
会员3
会员4
会员5
..
我想在命令中运行它们,

command name Group 1 member.1 Member1, member.2 Member2,...

当它到达空行时,移动到

Group 2 member.1 Member3, ...

依此类推,直到文件结束。
最终结果将是列出可以在以后执行的命令
名称组1 member.1路由器1,member.2路由器2
名称组2 member.1路由器3、member.2路由器4、member.3路由器4
名称组3 member.1用户X,member.2用户Y,..
不知道如何设置逻辑,因为我是初学者
谢谢你

7dl7o3gd

7dl7o3gd1#

使用GNU Awk:

$ awk '
BEGIN { RS = "\n\n"; FS="\n" }
{ printf("command name %s", $1)
  for (i = 2; i <= NF && $i; i++)
  { printf(" member.%s %s,", i - 1, $i) }
  print "" }' data
command name Group 1 member.1 Member1, member.2 Member2,
command name Group 2 member.1 Member3, member.2 Member4, member.3 Member5,

为什么我们有测试i <= NF && $i而不仅仅是i <= NF,因为\n(换行符)是字段 * 分隔符 * FS而不是字段 * 终止符 *,最后一条记录看起来像是有一个额外的空白字段。最后一条记录后面没有另一条记录,因此记录分隔符\n\n不会出现在其最后一个字段之后。因此,出现的终止\n被解释为字段分隔符,导致额外的空白字段。
编辑:因为问题中的示例以, ...结尾,所以我没有遵循逗号是终止符还是分隔符的任何要求。这将删除尾随逗号:

$ awk '
BEGIN { RS = "\n\n"; FS="\n" }
{ printf("command name %s", $1)
  for (i = 2; i <= NF && $i; i++)
  { printf("%smember.%s %s", i == 2 ? " " : ", ", i - 1, $i) }
  print "" }' data
command name Group 1 member.1 Member1, member.2 Member2
command name Group 2 member.1 Member3, member.2 Member4, member.3 Member5

我常用的分隔符技巧是写一个条件,对第一个元素作出React;比如虚拟变量i为零,或者在这种情况下为2。
也就是说,我们把分隔符看作是每一项的前缀。在像a, b, c这样的列表中,一种看待它的方法是c缺少一个尾随逗号。但另一种看待它的方式是第一个元素a缺少前导,(逗号+空格)。对于a以外的所有元素,我们首先输出,,然后输出元素。
我通常更喜欢这样,因为i == 0i == n - 1更好。在这种情况下,它特别方便,因为我们有复杂的终止条件i <= NF && $i,所以最后一个元素不是固定索引NF。但第一个元素是固定的。
此外,在第一个元素没有出现在固定索引处的情况下(比如说我们正在从列表中过滤项目,并希望它们以逗号分隔),我们可以使用标志!

first = true;
for (i below number_of_fields)
{
  if (satisfies_condition(item[i])) {
    if (!first)
      print(", ");
    print(item[i]);
    first = false;   
  }
}

同样,我们不能有一个标志来告诉我们哪个项目是最后的;除了一个特殊的情况,我们没有办法知道哪一项可能是最后一项。

相关问题