有没有更好的方法(例如AWK中的一个班轮)我可以在列表名称中使用标题获取列号?我希望能够独立于列号的实际处理列(例如,当添加另一列时,脚本不需要更改).
例如,给定"table.tsv"中的下表:
ID Value Target Not Used
1 5 9 11
2 4 8 12
3 6 7 10
Run Code Online (Sandbox Code Playgroud)
我可以使用以下方法对"目标"列进行排序:
#!/bin/bash
(IFS=$'\t'; read -r; printf "%s\n" "$REPLY"; i=0; for col in $REPLY; do
((++i))
[ "$col" == "Target" ] && break
done; sort -t$'\t' "-k$i,${i}n") < table.tsv
Run Code Online (Sandbox Code Playgroud)
有没有办法没有for循环(或至少清理一下)?
给定脚本的预期输出是:
ID Value Target Not Used
3 6 7 10
2 4 8 12
1 5 9 11
Run Code Online (Sandbox Code Playgroud)
但是,我试图给出一个我想要做的事情的例子.我想通过几个程序传递/过滤我的表,因此应保留标题和所有列:只需在每一步进行处理.在伪代码中,我想做的是:
print headings from stdin
i=$(magic to determine column position given "Target")
sort -t$'\t' …Run Code Online (Sandbox Code Playgroud) 如何在模块中包含自定义排序功能?
例如,如果我创建以下脚本(test.pl):
#!/usr/bin/perl
use 5.022;
use warnings;
use diagnostics;
use utf8;
use open qw(:std :utf8);
binmode STDOUT, ":utf8";
binmode STDERR, ":utf8";
sub mysort {
return $a cmp $b;
}
my @list = ('a', 'd', 'b', 'c');
say join "\n", sort mysort @list;
Run Code Online (Sandbox Code Playgroud)
它工作正常.但是当我把它们分成test.pl时:
#!/usr/bin/perl
use 5.022;
use warnings;
use diagnostics;
use utf8;
use open qw(:std :utf8);
binmode STDOUT, ":utf8";
binmode STDERR, ":utf8";
use my::module;
my @list = ('a', 'd', 'b', 'c');
say join "\n", sort mysort @list;
Run Code Online (Sandbox Code Playgroud)
和我的/ module.pm:
package …Run Code Online (Sandbox Code Playgroud) 我正在尝试使用正则表达式匹配重叠部分时使用/ g.我相信我需要使用lookbehind,但我无法理解文档并使其匹配.
例如,测试用例:
use feature ':5.18';
use warnings;
use diagnostics;
use utf8;
my $test = '1 1 1';
$test =~ s/(?=[0-9]+) ([0-9]+)/$1$2/g;
say $test; # still get '1 1 1'
Run Code Online (Sandbox Code Playgroud)
我如何摆脱空间?输出应为'111'.