Arrays 在perl中捕获列并打印到文件

Arrays 在perl中捕获列并打印到文件,arrays,perl,awk,foreach,split,Arrays,Perl,Awk,Foreach,Split,我有一个基本上是组ID列表的数组。我将使用数组使用foreach循环将ID放入专有的linux命令中,但也将使用数组元素来命名文件(每个ID都需要输出到自己的单独文件)。我有一些问题,打开文件,或者使用AWK查找和打印列,或者我也尝试了split命令,但我也无法正常工作。以下是我目前拥有的一个样本: #!/usr/bin/perl -w # Title: groupmem_pull.pl # Pupose: Pull group membership from group IDs in arr

我有一个基本上是组ID列表的数组。我将使用数组使用foreach循环将ID放入专有的linux命令中,但也将使用数组元素来命名文件(每个ID都需要输出到自己的单独文件)。我有一些问题,打开文件,或者使用AWK查找和打印列,或者我也尝试了split命令,但我也无法正常工作。以下是我目前拥有的一个样本:

#!/usr/bin/perl -w
# Title: groupmem_pull.pl
# Pupose: Pull  group membership from group IDs in array

use strict;
use warnings;

my $gpath = "/home/user/output";
my @grouparray = (
"219",
"226",
"345",
"12",
);
print "Checking Groups:\n";

foreach (@grouparray)
    {
    print `sudo st-admin show-group-config --group $_ | egrep '(Group ID|Group Name)'`;
    print `sudo st-admin show-members --group $_ > "$gpath/$_.txt"`;
    #print `cat $gpath/$_`;
    #print `cat $gpath/$_ | awk -F"|" '{print $2}' >`;
    open (FILE, "$gpath/$_.txt") || die "Can't open file\n: $!";
            while(my $groupid = <FILE>)     {
                                            `awk -F"|" '{print $2}' "$gpath/$_.txt" > "$gpath/$_.txt"`;
                                            #print `cat "$gpath/$_.txt" | awk -F"|" '{print $2}' > $_.txt`;
                                            }
#/usr/bin/perl-w
#标题:groupmem_pull.pl
#Pupose:从数组中的组ID中提取组成员身份
严格使用;
使用警告;
my$gpath=“/home/user/output”;
my@grouparray=(
"219",
"226",
"345",
"12",
);
打印“检查组:\n”;
foreach(@grouparray)
{
打印'sudo st admin show group config--group$| egrep'(组ID |组名)';
打印'sudo st admin show members--group$\u>“$gpath/$\utxt”`;
#打印“cat$gpath/$”;
#打印'cat$gpath/$| awk-F“|”{print$2}>`;
打开(文件“$gpath/$124; txt”)| | die“无法打开文件\n:$!”;
while(my$groupid=){
`awk-F“|”“{print$2}'”$gpath/$\.txt”>“$gpath/$\.txt”`;
#打印'cat'$gpath/$uzy.txt“| awk-F”|“{print$2}'>$zy.txt`;
}

现在,它在AWK文章中指出“在./groupmem_pull.pl第57行第2行的连接(.)或字符串中使用未初始化值$2”是错误的第一个命令的输出基本上将每个组ID拉入一个用管道分隔的文本文件中。我在这一个上花了很长时间,我无法让我在stackoverflow上找到的一些示例正常工作。非常感谢您的帮助!

我认为在字符串中转义美元不是指Perl variable可以解决这个问题(在您的情况下,
$2
变成了
\$2


我认为Antoh关于错误消息的看法是正确的。但是,我也认为程序的结果可能不是您所期望的。我也同意,如果您消除AWK组件,也许“纯Perl”解决方案可能会更好

如果我理解正确,您希望为@grouparray中的每个组运行此命令

sudo st-admin show-members --group <group id>

Hambone的代码对我很有用。Antoh也有一个很好的建议,似乎可以解决错误,但它导致输出为空。最好的方法是简化我的原始代码,实现Hambone的一些建议,即如何调用一个函数,通过Split而不是AWK拉出我需要的列


谢谢!

您已经使用了Perl,这是AWK中可用的超集,那么为什么不在Perl代码中使用AWK呢?而且,如果这样做,就不需要编写临时文件……只要直接从Perl中读取
st admin
命令输出。嘿,Jim,我对脚本编写非常陌生,所以我的已知知识有限。可以吗直接从Perl运行st admin命令是什么意思?这不是我已经在做的吗?谢谢Anton!这确实允许我在没有收到错误消息的情况下继续操作,但是AWK命令不知何故生成了一个空白文件。请看上面Hambone的评论-这可能解决了我的空白文件问题。我现在有一个在休息了一会儿之后,今天再次尝试脚本。汉伯恩,这正是我本来应该做的。我不知道你可以qq{}一个命令,让它像这样运行。它的输出和我为每个组需要的完全一样。非常感谢你和每个人在这方面的帮助。不客气。你可能已经知道这一点,但qq/hello/和“hello”是一样的它只是简化了它,如果字符串中有引号,因为你可以选择几乎任何你想要的边界字符:qq | hello |,qq(hello),qq!hello!酷,谢谢!现在我只需要弄清楚如何导出到CSV而不是TXT。使用Text::CSV。它处理CSV的所有讨厌的细节。
sudo st-admin show-members --group <group id>
use strict;
use warnings;

my $gpath = "/home/user/output";
my @grouparray = qw(219 226 345 12);

print "Checking Groups:\n";

foreach (@grouparray)
{
   open my $FILE, '-|', qq{sudo st-admin show-members --group $_} or die $!;
   open my $OUT, '>', "$gpath/$_.txt" or die $!;
   while (<$FILE>) {
     # chomp;  # if there are only two fields
     my ($field) = (split /\|/, $_, 3)[1];
     print $OUT $field, "\n";
   }
   close $OUT;
   close $FILE;
}