Как я могу перечислить предпоследнее слово, найденное в последовательности операторов в awk

[

] Вот так? Похоже на плаугерство, но эй хо[

] [

]Мне нравится настраивать любой встроенный проект с помощью ethernet статический IP, чтобы я мог легко подключаться к нему. WiFI предпочтительнее проводного, так что я могу сделать мой проект мобильным. Большая часть работы заключалась в том, что BBB не нуждался в драйверах для работы с имеющимся у меня USB WiFi модулем Edimax. Это тот же самый модуль, который часто используется с Raspberry Pi. Angstrom, к их чести (а иногда и к ущербу), отлично справляется с последними версиями пакетов и драйверов.[

] [

]Я впервые попробовал пройтись по сетевому менеджеру, который идет с Angstrom, Connman. Connman смог настроить WiFi для DHCP без проблем. Где он упал, так это то, что он, кажется, не смог ни поднять интерфейс при загрузке, ни настроить его со статическим IP. Я попытался добиться этого как с помощью графического интерфейса, так и с помощью написания конфигурационного файла Connman для беспроводного интерфейса. Поэтому я отказался от Connman. Он не готов к прайм-тайму. Некоторые будут утверждать, что принятие Ubuntu это подтверждает его готовность. Но те из нас, кто много лет страдал от плохих сетевых менеджеров на Ubuntu знают лучше, чем принять это. Более того, BBB является встроенной системой, а не ноутбуком. Он не должен беспокоиться о графическом интерфейсе, который позволяет пользователю на ходу часто менять конфигурацию беспроводного интерфейса. Я планирую встроить его во что-нибудь, и хочу, чтобы каждый раз интерфейсы были надежно одинаковыми.[

] [

]Поэтому я решил вернуться к основам. Во-первых, мне нужно было убрать Конмана с дороги. Вы можете отключить его следующим образом:[

] [
$ systemctl disable connman.service
] [

]Далее мне нужно было записать файл интерфейсов для настройки проводного и беспроводного интерфейсов.[

] [
auto lo
iface lo inet loopback

auto eth0
iface eth0 inet static
address 192.168.0.xxx
netmask 255.255.255.0
gateway 192.168.0.1
dns-nameservers 192.168.0.xxx,8.8.8.8

iface usb0 inet static
address 192.168.10.xxx
netmask 255.255.255.0
gateway 192.168.10.1
dns-nameservers 192.168.10.1,8.8.8.8

auto wlan0
iface wlan0 inet static
address 192.168.0.xx
netmask 255.255.255.0
gateway 192.168.0.xxx
dns-nameservers 192.168.0.1,8.8.8.8
wireless_mode managed
wireless_essid NAME_OF_AP
wpa-driver wext
wpa-conf /etc/wpa_supplicant.conf
pre-up wpa_supplicant -B -Dwext -iwlan0 -c/etc/wpa_supplicant.conf
post-down killall -q wpa_supplicant
] [

]Если вы используете шифрование на вашем беспроводном (и вы должны это сделать), то вам понадобится файл wpa_supplicant, который поможет вам подключиться. Вам понадобится ключ доступа к этому файлу. YOu может получить его для вашей сети следующим образом:[

] [
$ wpa_passphrase
] [

]Просто скопируйте и вставьте результат в ваш файл wpa_supplicant ([]/etc/wpa_supplicant.conf[]). Это должно выглядеть следующим образом:[

] [
ap_scan=2

network={
ssid=
proto=WPA RSN
key_mgmt=WPA-PSK
pairwise=CCMP TKIP
group=CCMP TKIP
psk=Big long string of hex number
}
] [

]Наконец, Angstrom не использует init.d, так что нам нужно больше, чем просто auto wlan0 в файле интерфейса, чтобы поднять интерфейсы во время загрузки. Angstrom использует systemd вместо init. Я читал, что для обратной совместимости systemd будет запускать скрипты в папке init.d, но, похоже, что это не так. Независимо от этого, кажется, имеет смысл просто идти по новому системному пути. Поэтому я написал быструю настройку службы, чтобы вывести интерфейсы на экран при загрузке. Она живёт в []/etc/systemd/system/net.service[].[

] [

]Вот содержимое служебного файла:[

] [
[Unit]
Description=Network interfaces
Wants=network.target
Before=network.target
BindsTo=sys-subsystem-net-devices-wlan0.device
After=sys-subsystem-net-devices-wlan0.device

[Service]
Type=oneshot
RemainAfterExit=yes
ExecStart=/bin/sh -c "sleep 5;ifup wlan0"
ExecStop=/bin/sh -c "ifdown wlan0"

[Install]
WantedBy=multi-user.target
] [

]Он вызывает WiFi после загрузки драйвера, но перед сетевой целью (в большинстве случаев всё, что будет использовать сеть).[

] [

]Для того, чтобы его можно было запустить при загрузке, просто сделайте это:[

] [
$ systemctl enable net.service
] [

] Вот и все. WiFi поставляется со статическим IP при загрузке. Я могу подключаться к BBB и монтировать диски удаленно. [

]
1
28.02.2014, 19:07
4 ответа

Вы хотите посчитать количество раз или количество строк, в которых появились вишни?

awk -F, '$0~k{s=s (s?", ":x) $(NF-1); t+=gsub(k,x)}
         END{printf "food: %s\n%s appeared %d/%d times\n", s, k, t, NR}
        ' k=cherries file

или

awk -F, '$0~k{s=s (s?", ":x) $(NF-1); t++}
         END{printf "food: %s\n%s appeared in %d/%d lines\n", s, k, t, NR}
        ' k=cherries file
1
27.01.2020, 23:38

Я думаю то, что вам нужно, это

$ awk -F, 'BEGIN{ORS=",";printf "food: "} 
          /cherries/{print $(NF-1); matches++;}; 
          END{printf "\ncherries appeared "matches "/" NR " times\n"}' file 
food: berries,guacamole,
cherries appeared 2/7 times

Обратите внимание, что ваш файл имеет двойной интервал, поэтому количество строк включает пустые. Чтобы избежать этого, используйте

$ awk -F, 'BEGIN{ORS=",";printf "food: "} 
           /./{k++} 
           /cherries/{print $(NF-1); matches++;};
          END{printf "\ncherries appeared matches /" k " times\n"}' file
food: berries,guacamole,
cherries appeared matches /4 times

-F "," эквивалентно FS = "," . ORS - это разделитель выходных записей, для которого также установлено значение , для облегчения печати. Обратной стороной является то, что он добавляет дополнительные , в конце строки food: , но вы можете удалить их, пропустив | sed 's /, $ //' . Ваша основная проблема заключалась в том, что awk print печатает все, что вы ему даете, за которым следует значение ORS , которое по умолчанию является новой строкой.

Я не понимаю, что вы подразумеваете под вишенками как предпоследним полем, поскольку в вашем примере это не так.

0
27.01.2020, 23:38

приводит к этому выводу:

1
27.01.2020, 23:38

Другой способ:

awk -F, 'BEGIN{printf "food: "}
         /cherries/ {printf $(NF-1) FS; count++}
         END{printf "\ncherries appeared %d/%d times\n", count, NR}' file
  • BEGIN печатает текстовый заголовок.
  • /cherries/ {printf $(NF-1) FS; count++} продолжает печатать второе последнее слово в строках, содержащих cherries. В этом случае он также отслеживает, сколько строк совпадает.
  • END печатает резюме.

Для вашего файла он возвращает:

$ awk -F, 'BEGIN{printf "food: "} /cherries/ {printf $(NF-1) FS; count++} END{printf "\ncherries appeared %d/%d times\n", count, NR}' file
food: berries,guacamole,
cherries appeared 2/4 times
0
27.01.2020, 23:38

Теги

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