小编123*_*123的帖子

是否在AWK的END块中定义了字段?

使用时会发生什么$1,$2...在END块,如:

awk '{print $3}END{print $1 $2}'
Run Code Online (Sandbox Code Playgroud)

我发现$1$2保留了最后一条记录的值.这种行为是由标准保证还是特定于实现?

variables bash awk gawk

7
推荐指数
1
解决办法
411
查看次数

负参数在参数扩展中如何在extglob中工作

问题

的行为

!(pattern-list)
Run Code Online (Sandbox Code Playgroud)

特别是在参数扩展中使用时,我的工作方式不正常

${parameter/pattern/string}
Run Code Online (Sandbox Code Playgroud)

输入

a="1 2 3 4 5 6 7 8 9 10"
Run Code Online (Sandbox Code Playgroud)

测试用例

$ printf "%s\n" "${a/!([0-9])/}"
[blank]
#expected 12 3 4 5 6 7 8 9 10

$ printf "%s\n" "${a/!(2)/}"
[blank]
#expected  2 3 4 5 6 7 8 9 10

$ printf "%s\n" "${a/!(*2*)/}"
2 3 4 5 6 7 8 9 10
#Produces the behaviour expected in previous one, not sure why though

$ printf "%s\n" "${a/!(*2*)/,}"
,2 3 4 5 6 …
Run Code Online (Sandbox Code Playgroud)

bash extglob parameter-expansion

6
推荐指数
1
解决办法
158
查看次数

extglob 如何与 shell 参数扩展一起使用?

我想我理解了可选的使用 ?(pattern-list)bashextglobshell 选项打开时)和默认情况下的使用ksh。例如在bash

$ shopt -s extglob
$ V=35xAB
$ echo "${V#?(35|88)x}" "${V#35}"
AB xAB
Run Code Online (Sandbox Code Playgroud)

但是,当匹配的前缀模式只有 one?()或 one时*()(这引入了我所说的可选模式)35除非使用,否则不会被省略##

$ echo "${V#?(35|88)}" "${V#*(35|88)}"    # Why 35 is not left out?
35xA 35xA
$ echo "${V##?(35|88)}" "${V##*(35|88)}"  # Why is it omitted when ## is used?
xA xA
Run Code Online (Sandbox Code Playgroud)

?()当和*()用于匹配后缀模式时(使用%和) ,会报告相同的行为%%

$ echo …
Run Code Online (Sandbox Code Playgroud)

bash ksh pattern-matching prefix suffix

5
推荐指数
1
解决办法
579
查看次数

将输出从exec发送到文件perl

问题

在perl中运行exec时,我无法将输出重定向到文件.

我在exec中运行vlc但是因为我怀疑每个人都设置了我已经用下面的echo替换它,它显示了相同的行为示例.

我只对exec'命令'感兴趣,'args'格式的exec不是那个产生shell的格式,因为它生成了一个带有vlc的子shell,它仍会打印到屏幕+其他问题,干净地杀死它.


use strict;
use warnings;

my $pid = fork;
if (!defined $pid) {
    die "Cannot fork: $!";
}
elsif ($pid == 0) {
    exec "/usr/bin/echo","done";
}
Run Code Online (Sandbox Code Playgroud)

试着

exec "/usr/bin/echo","done",">/dev/null";
Run Code Online (Sandbox Code Playgroud)

正如预期的那样只打印">/dev/null",但值得一试.

exec "/usr/bin/echo done >/dev/null";
Run Code Online (Sandbox Code Playgroud)

运行sh然后运行echo,在这里工作,但不是我在vlc的实际问题,我想我会包括,因为有人肯定会建议它.

当使用'command','args'到文件时,如何重定向此exec的输出?

额外

如需更多信息,请询问.

bash perl

5
推荐指数
0
解决办法
355
查看次数

Perl匿名管没有输出

除非我从管道打印实际数据,否则为什么在使用匿名管道时没有打印?


use strict;
use warnings;

my $child_process_id = 0;
my $vmstat_command = 'vmstat 7|';
$child_process_id = open(VMSTAT, $vmstat_command) || die "Error when executing \"$vmstat_command\": $!";


while (<VMSTAT>) {
    print "hi" ;
}
close VMSTAT or die "bad command: $! $?";
Run Code Online (Sandbox Code Playgroud)

似乎挂了


use strict;
use warnings;

my $child_process_id = 0;
my $vmstat_command = 'vmstat 7|';
$child_process_id = open(VMSTAT, $vmstat_command) || die "Error when executing \"$vmstat_command\": $!";


while (<VMSTAT>) {
    print "hi" . $_ ;
#                ^^^ Added this
} …
Run Code Online (Sandbox Code Playgroud)

linux bash perl

4
推荐指数
1
解决办法
113
查看次数

在 bash 大括号扩展中更改分隔符/分隔符

前提

我意识到这个问题已经存在,但解决方案实际上并没有改变分隔符。我想知道是否可以更改分隔符,或者是否有人知道它所在的位置。


例子

假设我需要将此字符串传递给程序,以逗号分隔,因为这是程序接受的

echo \"abc" "{def,ghi}\"
Run Code Online (Sandbox Code Playgroud)

印刷

"abc def" "abc ghi"
Run Code Online (Sandbox Code Playgroud)

我想要的地方

"abc def","abc ghi"
Run Code Online (Sandbox Code Playgroud)

显然,这只是一个简单的例子。


我试过的

没有什么,因为我不知道在哪里寻找这个分隔符,尽管我已经进行了广泛的搜索

也作为一个子问题:

尝试使用 choroba 的另一个问题的答案将其传递给我的脚本时会产生错误。诚然,我还没有尝试过很长时间

我试过

./script ( set abc" "{def,ghi} ; IFS=: ; echo "$*" )
./script < <( set abc" "{def,ghi} ; IFS=: ; echo "$*" )
./scipt $(( set abc" "{def,ghi} ; IFS=: ; echo "$*" ))
Run Code Online (Sandbox Code Playgroud)

bash brace-expansion

3
推荐指数
1
解决办法
2191
查看次数

如何使管道顺序运行

眼镜

不要认为这应该有所作为,但无论如何我都会包括它

GNU bash,版本3.2.51


前提

所以说我有一个包含多个部件的管道,如何防止部分管道在前一个部件完成之前运行.


在下面的例子中,我将尝试显示问题

$ echo hello | tee /dev/tty | (echo "Next";sed 's/h/m/' )
Run Code Online (Sandbox Code Playgroud)

产量

Next
hello
mello
Run Code Online (Sandbox Code Playgroud)

用睡眠来表明它是关闭的时间

$ echo hello | tee /dev/tty | (sleep 2;echo "Next";sed 's/h/m/' )
Run Code Online (Sandbox Code Playgroud)

产量

hello
Next
mello
Run Code Online (Sandbox Code Playgroud)

预期产出

如上所述

hello
Next
mello
Run Code Online (Sandbox Code Playgroud)

但显然这取决于睡眠时间长于前一个命令完成所需的时间,这不是我想要的.


笔记

我知道有更好的方法可以做到这一点,但我认为让我了解管道的工作方式对我来说很有教育意义.


试着

尝试等待和睡眠的变化和事情,但没有一致的工作.


l0b0的建议

这仍然打印下一个虽然

$ echo hello | tee /dev/tty | sort |(echo "Next";sed 's/h/m/' )
Next
hello
mello

$ echo hello | tee /dev/tty | tac | tac |(echo "Next";sed 's/h/m/' …
Run Code Online (Sandbox Code Playgroud)

unix linux bash pipe

2
推荐指数
2
解决办法
3909
查看次数

不区分大小写的哈希键perl

问题

我有一个哈希/数组结构,但是有些哈希键不是在相同的情况下.

我想知道是否有办法处理这种情况,而无需手动检查每个哈希的键.

在下面的示例中,我希望打印所有ID/iD/id/Id字段.


示例代码

use warnings;
use strict;


my $Hash = {
   Server  =>   [
                        {
                                Id=>123
                        },
                        {
                                iD=>456
                        },
                        {
                                ID=>789
                        }
                ]

};

for (@{$Hash->{Server}}){
        print "$_->{ID}\n"
        #This is the problematic part
}
Run Code Online (Sandbox Code Playgroud)

其他

perl版本:v5.10.0

这些数据从其他地方收到并且必须保持相同的情况,上面的例子是最小的,我不能简单地将它们全部更改为相同的情况.

需要更多信息让我知道.

linux perl

1
推荐指数
1
解决办法
452
查看次数

使用awk计算统计量

我有一个关于我以前的成功回答问题一个问题在这里通过@fedorgui.

我有一张桌子:

pac1 xxx 
pac1 yyy
pac1 zzz
pac2 xxx
pac2 uuu
pac3 zzz
pac3 uuu
pac4 zzz
Run Code Online (Sandbox Code Playgroud)

我需要像这样计算输出:

pac1 xxx 2/4
pac1 yyy 1/4
pac1 zzz 3/4
pac2 xxx 2/4
pac2 uuu 2/4
pac3 zzz 2/4
pac3 uuu 2/4
pac4 zzz 3/4
Run Code Online (Sandbox Code Playgroud)

第一列中的第一个数字是第二列中的唯一出现次数(在这种情况下,xxx在第二列中出现2,而uniq第一列出现在第二列中 4 => 2/4

解决方案在awk中工作在这里:

$ awk 'FNR==NR {col1[$1]++; col2[$2]++; next} {print $0, col2[$2] "/" length(col1)}' file file
Run Code Online (Sandbox Code Playgroud)

但我的输入可能有重复的行,如:

pac1 xxx
pac1 xxx 
pac1 xxx  
pac1 yyy
pac1 zzz
pac2 xxx
pac2 xxx
pac2 xxx …
Run Code Online (Sandbox Code Playgroud)

linux bash awk sed

1
推荐指数
1
解决办法
82
查看次数

为什么哈希值被打印两次

问题

哈希值在(每个)循环中打印两次.


use strict;
use warnings;

my %Hash;

my $x=1;

foreach my $item( 1..9 ) {
   $Hash{$x} = $x;
   print scalar keys %Hash,",$item,",$x++,"\n"
}
$x=1;
foreach my $iteml( %Hash){
        print $x++,"\n";
        print "||||$iteml------$Hash{$iteml}||||\n";
}

print "@{[%Hash]}\n";
Run Code Online (Sandbox Code Playgroud)

产量

1,1,1
2,2,2
3,3,3
4,4,4
5,5,5
6,6,6
7,7,7
8,8,8
9,9,9
1
||||6------6||||
2
||||6------6||||
3
||||3------3||||
4
||||3------3||||
5
||||7------7||||
6
||||7------7||||
7
||||9------9||||
8
||||9------9||||
9
||||2------2||||
10
||||2------2||||
11
||||8------8||||
12
||||8------8||||
13
||||1------1||||
14
||||1------1||||
15
||||4------4||||
16
||||4------4||||
17 …
Run Code Online (Sandbox Code Playgroud)

linux perl

0
推荐指数
1
解决办法
97
查看次数