awk сопоставляет строку и значения столбца суммы

Один может написать сценарии ван Смуренбурга rc, которые делают это. Они заканчиваются конструкцией caseesacдля каждого отдельного шага в сценарии. Это невозможно поддерживать.

Это одна из известных проблем с этим механизмом.

Добавьте к этому тот факт, что скрипты ван Смуренбурга rcне использовались в Ubuntu и Fedora в течение многих лет. В обоих случаях до systemd у них был Upstart. Кроме того, в Arch Linux отключена совместимость с van Smoorenburg rcв systemd. Думать, что сценарий ван Смуренбурга rcявляется неким универсальным минимумом, который каждый может запустить , даже игнорируя варианты вспомогательных команд , — это откровенная ошибка. Вы стремитесь к неправильной цели.

Чтобы получить хотя бы представление о значительных различиях, которые необходимо учитывать при написании одного сценария для всех разновидностей, учтите, что с 2014 года способ написания сценариев ван Смуренбурга rcв Debian теперь задокументирован следующим образом:

#!/lib/init/init-d-script

## BEGIN INIT INFO
# Provides:          myvpn
# Required-Start:    $network $local_fs $remote_fs
# Required-Stop:     $network $local_fs $remote_fs
# Default-Start:     2 3 4 5
# Default-Stop:      0 1 6
# Short-Description: MY VPN service
# Description: This script starts the MY VPN Daemon
### END INIT INFO

DAEMON=/opt/myvpn/bin/myvpn-daemon
NAME=myvpn
export LD_LIBRARY_PATH=/opt/myvpn/lib

Поскольку он намного короче вашего сценария, здесь есть место для дополнительного контента. Берем грубый сервисный блок systemd…

% cat myvpn.service
[Unit]
Description=My VPN service

[Service]
ExecStart=/opt/myvpn/bin/myvpn-daemon
Environment=LD_LIBRARY_PATH=/opt/myvpn/lib
Restart=always

[Install]
WantedBy=multi-user.target
%

… и преобразовать его …

% system-control convert-systemd-units --no-generation-comment./myvpn.service
%

… показано, как будет выглядеть определение семейного сервиса daemontools -(в этом случае с использованием набора инструментов nosh ):

% system-control print-service-scripts./myvpn
start:#!/bin/nosh
start:true
stop:#!/bin/nosh
stop:true
run:#!/bin/nosh
run:#My VPN service
run:move-to-control-group../myvpn.service
run:getuidgid
run:userenv-fromenv
run:setenv LD_LIBRARY_PATH /opt/myvpn/lib
run:chdir /
run:/opt/myvpn/bin/myvpn-daemon
restart:#!/bin/sh
restart:sleep 0.1
restart:exec true       # ignore script arguments
%

Менеджеры служб семейства Daemontools -могут работать в операционных системах, отличных от -Linux,и автоматический перезапуск даже по умолчанию в этом мире.

Дополнительная литература

0
13.10.2020, 17:10
3 ответа

авк

Вы можете использовать строковую функцию gsub , которая возвращает количество замен, сделанных в строке. Это удобный способ подсчета вхождений в строке, и вы делаете это для всех строк, так что вы считаете их все.

awk '{cnt += gsub(/United States/,"&")} END {print cnt}' *.csv

Если вы хотите использовать эту проверку внутри скрипта awk, как в вашем примере, вы можете использовать такой синтаксис, как:

awk '{ if (gsub(/pattern/"&")) {"do stuff here"} }' file

или

awk '{x = gsub(/pattern/"&"); "do stuff with x here"; }' file

группа

Также, используя grep, с -oмы получим одну строку на совпадение в выводе, и результатом будет количество строк вывода.

grep -o "United States" *.csv | wc -l
1
18.03.2021, 22:57

Учитывая предоставленный вами образец входного файла, ответ @nezabudka:

awk 'BEGIN {RS=",|\n"} /United States/ {i++} END {print i}' inputFile

кажется правильным. Это побуждает меня спросить вас :, уверены ли вы, что ваш образец входного файла репрезентативен для всех ваших разделителей полей -? Если нет, вот альтернативное решение, которое допускает случаи входного файла, такие как:

> cat inputFile
United States,1,2,3
Donald TRump,1,2,3 United States blih blah \!?# bluh  United States
United States,1,2,3,United    States

> awk 'BEGIN {RS=",|\n| "} 
       /United/ {rec=NR; next} 
       /States/ && NR==rec+1 {i++} 
       END {print i}'  inputFile
5
0
18.03.2021, 22:57

Команда

    #/bin/bash

    awk '{print gsub("United States",$0)}' filename| awk 'BEGIN{sum=0}{sum=sum+$1}END{print sum}'
0
18.03.2021, 22:57

Теги

Похожие вопросы