awk не печатает вывод во вторичный файл, синтаксическая ошибка? - PullRequest
2 голосов
/ 10 июня 2019

Больше с моими журналами радио ... Пока что работа, которую я выполнил, великолепна, push-уведомления идут отлично, на самом деле слишком хорошо.Я получаю бомбардировку с каждой случайной связью.Я хочу отфильтровать журнал, чтобы отправлять уведомления только в том случае, если микрофон подключен дольше, чем на 1,5 секунды (4-е поле), сокращая уведомления только до реального общения.Я пытаюсь отфильтровать оригинальный файл "completelog.txt" в файл "Filterlog.txt".Оригинал выглядит так:

W7MIT,TG 91,4601149,0.5,0,0.00
W7MIT,TG 91,4601149,0.8,0,0.00
VA3GJB,TG 91,4601149,1.2,0,0.00
G0IOR,TG 91,2345614,11.6,0,0.00
G0IOR,TG 91,2345614,10.6,0,0.00
G4NHP,TG 91,2345614,6.2,2,0.00
GM0TKC,TG 91,2345614,0.5,0,0.00
EA8CTB,TG 91,2345614,2.3,0,0.00
EA8CTB,TG 91,2345614,1.6,0,0.00
GM1RCP,TG 91,2345614,0.5,12,0.00

Код, который я пытался использовать, находится здесь:

#!/bin/bash
awk -v x=1.5 '$4 >= x' completelog.txt >> filteredlog.txt

Затем я попытался не добавлять (я думаю)

#!/bin/bash
awk -v x=1.5 '$4 >= x' completelog.txt > filteredlog.txt

Поскольку ни одна из них не сработала, я добавил sudo (не думаю, что это необходимо)

#!/bin/bash
sudo awk -v x=1.5 '$4 >= x' completelog.txt >> filteredlog.txt

И снова не добавляю (все еще думая, что это означает).

#!/bin/bash
sudo awk -v x=1.5 '$4 >= x' completelog.txt > filteredlog.txt

Затем ятолько начал угадывать случайные вещи.

awk -v x=1.5 '$4 >= x'  completelog.txt

И снова ...

awk '$4>=1.5{print}' completelog.txt

Все безрезультатно.Я получил несколько ошибок разрешения, даже если файлы chmoded и даже пытались с sudo.Скажите, пожалуйста, что я делаю не так?

Ответы [ 3 ]

2 голосов
/ 10 июня 2019

(не ответ, расширенный комментарий)

Перенаправление sudo [command ...] > file вводит в заблуждение: вы запускаете команду с sudo privs, но перенаправление файлов выполняется с your privs. Это связано с тем, что оболочка обрабатывает перенаправления до обработки фактической команды.

Два обходных пути:

  1. используйте tee с sudo privs:

    some command with args | sudo tee -a privileged_file
    

    Эта команда запускается как вы, но добавляется в файл как sudo.

  2. обернуть все в оболочку с sudo privs:

    sudo sh -c 'some command with args >> privileged_file'
    
2 голосов
/ 10 июня 2019

Проблема в том, что вы не устанавливаете разделитель (Разделитель полей) в awk, поэтому он ожидает разделение пробелов по умолчанию. Вместо этого:

awk -F"," -v x=1.5 '$4 >= x' completelog.txt >> filteredlog.txt

Вы также можете указать это в блоке BEGIN самого скрипта awk, установив встроенную переменную FS:

awk -v x=1.5 'BEGIN{OFS=FS=","}$4>=x' completelog.txt >> filteredlog.txt

Устанавливает разделитель поля FS и разделитель поля вывода OFS на запятую.

0 голосов
/ 10 июня 2019

После публикации замечена ошибка прав доступа, но разделитель запятых тоже был отличным уловом, спасибо вам обоим.

pi-star@pi-star(rw):~$ awk -F"," '$4>=1.6{print}' completelog.txt > 
filteredlog.txt
-bash: filteredlog.txt: Permission denied
pi-star@pi-star(rw):~$ touch filteredlog.txt
touch: cannot touch ‘filteredlog.txt’: Permission denied
pi-star@pi-star(rw):~$ ls -l filteredlog.txt
-rwxr-xr-x 1 root root 0 Jun 10 08:09 filteredlog.txt
pi-star@pi-star(rw):~$ sudo chmod 777 filteredlog.txt
pi-star@pi-star(rw):~$ ls -l filteredlog.txt
-rwxrwxrwx 1 root root 0 Jun 10 08:09 filteredlog.txt
pi-star@pi-star(rw):~$ awk -F"," '$4>=1.6{print}' completelog.txt > 
filteredlog.txt
pi-star@pi-star(rw):~$ tail -f -n2 filteredlog.txt
PD2RAL,TG 91,2042416,6.7,1,0.00
N1AJW,TG 91,2042416,2.2,2,6.70
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...