Я не знаю ни о какой awk
реализации, которая имеет поддержку для этого. Вы можете написать расширение для gawk
этого , но здесь я бы лучше переключился на другой язык.
perl
позволяет легко конвертировать awk
скрипты с его a2p
скриптом.
Например, если у вас есть такой awk
скрипт:
{count[$0]++}
END {
for (i in count) printf "%5d %s\n", count[i], i
}
a2p
на это даст вам что-то вроде:
#!/usr/bin/perl
eval 'exec /usr/bin/perl -S $0 ${1+"$@"}'
if $running_under_some_shell;
# this emulates #! processing on NIH machines.
# (remove #! line above if indigestible)
eval '$'.$1.'$2;' while $ARGV[0] =~ /^([A-Za-z_0-9]+=)(.*)/ && shift;
# process any FOO=bar switches
while (<>) {
chomp; # strip record separator
$count{$_}++;
}
foreach $i (keys %count) {
printf "%5d %s\n", $count{$i}, $i;
}
То, что вы можете отредактировать, чтобы добавить свою обработку сигналов (и удалить ту обработку var=value
аргументов, которую мы здесь не хотим, и часть, предназначенную для систем, которые не поддерживают #!
):
#!/usr/bin/perl
sub report {
foreach $i (keys %count) {
printf "%5d %s\n", $count{$i}, $i;
}
}
$SIG{INT} = sub {
print STDERR "Interrupted\n";
report;
$SIG{INT} = 'DEFAULT';
kill('INT', $$); # report dying of SIGINT.
};
while (<>) {
chomp; # strip record separator
$count{$_}++;
}
report;
Другой альтернативой может быть , чтобы прервать подачу данных к awk
, и имеют awk
игнорировать SIGINT, как вместо того , чтобы :
awk '{count[$0]++};END{for (i in count) printf "%5d %s\n", count[i], i}' file
делать:
cat file | (
trap '' INT
awk '{count[$0]++};END{for (i in count) printf "%5d %s\n", count[i], i}'
)
Ctrl+Cпотом убью cat
но не awk
. awk
будет продолжать обрабатывать оставшиеся входные данные, все еще находящиеся в канале.
Для обнаружения Ctrl+Cин awk
, вы можете сделать:
(cat file && echo cat terminated normally) | (
trap '' INT
awk '{count[$0]++}
END{
if ($0 == "cat terminated normally") delete count[$0]
else print "Interrupted"
for (i in count) printf "%5d %s\n", count[i], i}'
)