Форум программистов, компьютерный форум, киберфорум
Наши страницы
Shell, Bash
Войти
Регистрация
Восстановить пароль
 
 
Рейтинг 4.60/5: Рейтинг темы: голосов - 5, средняя оценка - 4.60
belalugoci
-62 / 62 / 10
Регистрация: 01.06.2018
Сообщений: 766
Завершенные тесты: 1
1

Вывести 3-е поле с помощью AWK

03.10.2019, 12:11. Просмотров 848. Ответов 60
Метки нет (Все метки)

иногда пользуюсь для разбора текстовых файлов, вот лет 7 назад пользовался последний раз, забыл почти всё что тогда наизучал, а сейчас не могу даже простейшее сделать.
есть файл test.txt с текстом
Код
1 2 3 4 5 6 7
     1      2       3      4      5       6        7
последние 6 и 7 через табуляцию.
по логике здесь есть поля $1, $2, $3, $4 и т.д. Нас интересует поле $3 например, пишем файл mem.awk
Код
PRINT $3
и запускаем его
awk -f mem.awk test.txt
по логике должен напечатать
Код
3
3
но выводит весь файл
Код
1 2 3 4 5 6 7
     1      2       3      4      5       6        7
где я накриворучил?
0
QA
Эксперт
41792 / 34177 / 6122
Регистрация: 12.04.2006
Сообщений: 57,940
03.10.2019, 12:11
Ответы с готовыми решениями:

Как вывести определённые поля из /etc/passwd с помощью awk?
Здравствуйте, помогите пожалуйста разобраться с работой потокового редактора sed и утилитой awk....

Перенести 3-ю строку в начало файла с помощью awk
Здравствуйте. Как перенести в одном из текстовых файлов перенести третью от конца строку в начало...

С помощью awk определить минимум, максимум, среднее значение
Здравствуйте, помогите пожалуйста, буду заранее благодарен. 1. В файле сотрудники.txt определить...

Найти среднее арифметическое и 5 наибольших значений с помощью awk
Добрый вечер! Прошу помощи! С помощью текстового процессора awk необходимо выполнить задания: ...

Вырезать строку между 2 позициями с помощью sed и awk
Коллеги, добрый день. Помогите, пожалуйста, не могу разобраться. Не помогает даже гугл, все, что...

60
useroot
21 / 20 / 3
Регистрация: 18.08.2016
Сообщений: 90
03.10.2019, 15:19 2
Эм, awk -F '{print $3}' test.txt что-то типа этого, только не понял зачем нужен mem.awk?!
0
nezabudka
961 / 413 / 149
Регистрация: 28.06.2015
Сообщений: 935
Записей в блоге: 15
03.10.2019, 15:37 3
cat mem.awk
Bash
1
{print $3}
0
belalugoci
-62 / 62 / 10
Регистрация: 01.06.2018
Сообщений: 766
Завершенные тесты: 1
04.10.2019, 05:07  [ТС] 4
Цитата Сообщение от useroot Посмотреть сообщение
Эм, awk -F '{print $3}' test.txt что-то типа этого
В таком варианте вывод отсутствует вовсе.

Цитата Сообщение от useroot Посмотреть сообщение
только не понял зачем нужен mem.awk?!
Вы серьёзно?

Цитата Сообщение от nezabudka Посмотреть сообщение
{print $3}
В таком варианте вывод отсутствует вовсе.
0
04.10.2019, 05:07
skouzmine
32 / 28 / 12
Регистрация: 27.02.2016
Сообщений: 136
04.10.2019, 05:48 5
флаг выполнить аргумент это
Код
-e
разницы из фалиа или стрроки не д.б.

Код
cat >a.txt
1 2 3 4 5 6 7
     1      2       3      4      5       6        7<ctrl-D>

 awk -e '{print $3}' a.txt 
3
3

echo  '{print $3}' > a.awk
awk -f a.awk a.txt
3
3
0
belalugoci
-62 / 62 / 10
Регистрация: 01.06.2018
Сообщений: 766
Завершенные тесты: 1
04.10.2019, 07:01  [ТС] 6
Цитата Сообщение от skouzmine Посмотреть сообщение
разницы из фалиа или стрроки не д.б.
мы как минимум в разных системах запускаем, так что работающее у вас не обязательно будет работать у меня (и оно не работает).
может тогда сориентируете где взять заведомо рабочий awk под win32/64?

Добавлено через 1 час 4 минуты
скачал gawk 3.1.6 и 3.0.4 - везде поведение одинаковое и как надо оно не работает. качал с http://gnuwin32.sourceforge.net/packages/gawk.htm
0
skouzmine
32 / 28 / 12
Регистрация: 27.02.2016
Сообщений: 136
04.10.2019, 07:15 7
если под виндоуз cmd то кавычки д.б. двойные он одинарные непонимает
и еще наверное файл сохранен в юникод utf16 так делать не надо
а проще всего
откройте git баш и там все так как в линукс.
уж наверное вы git испольуете

а что не используете линукс кстати ? вещь
0
belalugoci
-62 / 62 / 10
Регистрация: 01.06.2018
Сообщений: 766
Завершенные тесты: 1
04.10.2019, 07:36  [ТС] 8
Цитата Сообщение от skouzmine Посмотреть сообщение
если под виндоуз cmd то кавычки д.б. двойные он одинарные непонимает
это понятно

Цитата Сообщение от skouzmine Посмотреть сообщение
и еще наверное файл сохранен в юникод utf16 так делать не надо
1251

Цитата Сообщение от skouzmine Посмотреть сообщение
откройте git баш и там все так как в линукс.
почитаю

Цитата Сообщение от skouzmine Посмотреть сообщение
уж наверное вы git испольуете
нет, даже не в курсе что это

Цитата Сообщение от skouzmine Посмотреть сообщение
а что не используете линукс кстати ? вещь
я на работе, у меня корпоративная вин7, сейчас выпросил новый пк с вин10, попробую там виртуалку поставить, еще нужно изучить что там майки интегрированного в самой вин10 сделали.

Добавлено через 12 минут
Цитата Сообщение от skouzmine Посмотреть сообщение
а что не используете линукс кстати ? вещь
поставил последний deepin на виртуалку, создал в хомяке test.txt такого же содержания как и ранее в винде, в терминале написал
Bash
1
awk '{ PRINT $3 }' test.txt
вывод в консоль абсолютно пустой, cat даёт нормальный вывод текста. Я уже теряюсь что не так?
0
Marinero
Модератор
Эксперт NIX
2290 / 1848 / 623
Регистрация: 02.03.2015
Сообщений: 6,010
04.10.2019, 09:36 9
belalugoci, не знаю чем Вы пользуетесь, только линукс чувствителен к регистру (PRINT, Print и print - это разные слова). Команды в awk строчными
Bash
1
awk '{ print $3 }' test.txt
Только в данном случае действиетльно проще использовать sed или cut (awk все же больше для математических действий чем работы с текстом)
0
belalugoci
-62 / 62 / 10
Регистрация: 01.06.2018
Сообщений: 766
Завершенные тесты: 1
04.10.2019, 09:45  [ТС] 10
Цитата Сообщение от Marinero Посмотреть сообщение
не знаю чем Вы пользуетесь
awk.exe windows 10 x64

Цитата Сообщение от Marinero Посмотреть сообщение
только линукс чувствителен к регистру (PRINT, Print и print - это разные слова). Команды в awk строчными
воооот, так работает, спасибо

Цитата Сообщение от Marinero Посмотреть сообщение
Только в данном случае действиетльно проще использовать sed или cut
нет "данного случая", задача будет другой и очень большой, где как раз будет много считаться и переделываться, так что awk, плюс я им пользовался и психологически будет проще.
0
Marinero
Модератор
Эксперт NIX
2290 / 1848 / 623
Регистрация: 02.03.2015
Сообщений: 6,010
04.10.2019, 09:57 11
Под
Цитата Сообщение от belalugoci Посмотреть сообщение
windows 10 x64
можно поставить линуксовую консоль (в Магазине приложений называется Ubuntu) и жить сразу станет намного проще.
0
useroot
21 / 20 / 3
Регистрация: 18.08.2016
Сообщений: 90
04.10.2019, 10:31 12
Цитата Сообщение от belalugoci Посмотреть сообщение
В таком варианте вывод отсутствует вовсе
Цитата Сообщение от belalugoci Посмотреть сообщение
В таком варианте вывод отсутствует вовсе.
Вам стоит перечитать, ваш пост: забыл почти всё что тогда наизучал и мой пост с что-то типа этого где я написал по памяти или считаете, что все постоянно у компов?! Тем более, разве вас это не подтолкнуло к решению проблемы?!

Цитата Сообщение от belalugoci Посмотреть сообщение
Вы серьёзно?
Да, я серьезно это тут ни к чему. Для этих целей подойдет простой однострочник чем создавать целый файл, вписывать в него данные, и т.д!
0
belalugoci
-62 / 62 / 10
Регистрация: 01.06.2018
Сообщений: 766
Завершенные тесты: 1
04.10.2019, 10:52  [ТС] 13
Цитата Сообщение от Marinero Посмотреть сообщение
можно поставить линуксовую консоль (в Магазине приложений называется Ubuntu) и жить сразу станет намного проще.
попробовал, но наш прокси режет работу с магазином.

Цитата Сообщение от useroot Посмотреть сообщение
Тем более, разве вас это не подтолкнуло к решению проблемы?!
каким образом? в моей логике если неправильный синтаксис то должно быть сообщение об ошибке, раз ошибок нет значит написано ПРАВИЛЬНО. А раз написано правильно, но не работает, значит есть какой-то нюанс, вот поисками нюансов мы и занимались.

Цитата Сообщение от useroot Посмотреть сообщение
Да, я серьезно это тут ни к чему. Для этих целей подойдет простой однострочник чем создавать целый файл, вписывать в него данные, и т.д!
для решения "2+2" не требуется ни калькулятор ни ПК, но если я создам тему "Почему print 2+2 не работает" вы тоже будете мне рассказывать про то, как можно посчитать 2+2 без ПК? Может я сам решу однострочно я буду выполнять код или напишу один файл?

---

в общем туго идёт как-то с awk, документация скудновата, все примеры однобоки.
например
awk -f mem.awk *.txt
mem.awk:
Bash
1
BEGIN { print ARGV[ARGC-1] }
Из всего набора TXT файлов на экран печатается только имя самого последнего файла...
Файлов много, нужно будет собирать информацию в кучу, но так же нужно будет выводить и пофайловую информацию, например в имени файла есть номер аудитории и когда будет делаться вывод, то его нужно использовать, что-то похожее на:
5-605:
ПК 5 шт
Проектор 2 шт
то есть номер кабинета дергаем из ARGV[ARGC-1] а остальное - результат обработки.
0
skouzmine
32 / 28 / 12
Регистрация: 27.02.2016
Сообщений: 136
04.10.2019, 20:03 14
к
Сообщение от skouzmine Посмотреть сообщение
уж наверное вы git испольуете
нет, даже не в курсе что это

- а *куда* вы программы пишете интересно
0
Marinero
Модератор
Эксперт NIX
2290 / 1848 / 623
Регистрация: 02.03.2015
Сообщений: 6,010
04.10.2019, 21:44 15
Цитата Сообщение от belalugoci Посмотреть сообщение
BEGIN { print ARGV[ARGC-1] }
Достаточно сложно написать работающий код не понимая синтаксис. Давайте сделаем проще: пример того что есть и что Вы хотите получить. Потому что регулировать извивы Вашей фантазии – путь в никуда
0
belalugoci
-62 / 62 / 10
Регистрация: 01.06.2018
Сообщений: 766
Завершенные тесты: 1
05.10.2019, 04:07  [ТС] 16
Цитата Сообщение от Marinero Посмотреть сообщение
Достаточно сложно написать работающий код не понимая синтаксис
читаю мануалы и пишу по ним, так что претензии к писателям оных.

Цитата Сообщение от Marinero Посмотреть сообщение
Давайте сделаем проще: пример того что есть и что Вы хотите получить
Я не могу озвучить ТЗ, так как в процессе изучения материала и буду писать код. Не будет работать awk - буду ручками копипастить в эксель.

Цитата Сообщение от Marinero Посмотреть сообщение
Потому что регулировать извивы Вашей фантазии – путь в никуда
Проблема, которая меня на данный момент интересует, описана выше. Данные взяты из мануалов и примеров, поэтому моих извивов там ноль.
Для некоторых вариаций awk есть BEGINFILE, который возможно мне и нужен. Я и пытаюсь разобраться с awk, чтобы понять можно ли с ним работать. Как я написал ранее - маны весьма скудны и не описывают многие аспекты работы, например поведение при указании имени файла в виде маски *.TXT

Цитата Сообщение от skouzmine Посмотреть сообщение
- а *куда* вы программы пишете интересно
1) мне не требуется контроль версий
2) мои программы не спасают мир, поэтому необходимости складывать их в какое-то специальное место просто нет
3) туда же, куда и 30 лет назад
4) на всякий случай - работа с git и ему подобными не входит даже в курсы программистов в университетах (не во всех конечно), значит жизненной необходимости им пользоваться просто нет.
5) из личного опыта (не знаю был ли это git, я во всяком случае не запомнил название): поставил VS, попросили настроить контроль версий, настроил. Написал код. Перешел на другой ПК, настроил, проект не появляется. Забил на это. Пришел домой, запустил VS, проекта тоже нет. Ок. Так как делал копию на флешку, скопировал с неё, поработал, закрыл VS, через какое-то время открыл VS - открылся проект на состояние, когда я его брал с флешки. Каких-то плюсов для проектов уровня "Hello world!" в принципе не вижу, так же ограничением является необходимость онлайна, что при работе с виртуалками как бы и не нужно (а иногда и противопоказано).
0
Marinero
Модератор
Эксперт NIX
2290 / 1848 / 623
Регистрация: 02.03.2015
Сообщений: 6,010
05.10.2019, 07:20 17
Цитата Сообщение от belalugoci Посмотреть сообщение
читаю мануалы и пишу по ним, так что претензии к писателям оных
У Вас наблюдается типичная "проблема XY": не обладая всей полнотой знаний Вы применяете не тот "инструмент".
0
belalugoci
-62 / 62 / 10
Регистрация: 01.06.2018
Сообщений: 766
Завершенные тесты: 1
05.10.2019, 09:04  [ТС] 18
Цитата Сообщение от Marinero Посмотреть сообщение
У Вас наблюдается типичная "проблема XY": не обладая всей полнотой знаний Вы применяете не тот "инструмент".
как я уже отметил - я пользовался awk и весьма успешно, не думаю что за 5 лет awk изменился настолько, что обработка текста в нескольких сотнях однотипных файлов вдруг не его стезя стала.
я и сейчас могу производитель обработку отдельного файла, а вот сделать обработку файлов по маске не получается, в документации такого описания я пока найти не смог. Например нет указания на поведения инструкции BEGIN в случае работы с новым файлом (как вариант я читаю не там).
Например в противовес awk тот же powershell весьма подробно документирован и имеет массу примеров, а все "нерабочие" варианты отображаются в консоли в видео ошибок, что позволяет их исправлять. Но написание сопоставимого по результату кода в ps для меня куда более трудоёмкая задача.

Добавлено через 45 минут
Цитата Сообщение от Marinero Посмотреть сообщение
Чтоб получить совет покажите: (1:что?)пример исходных данных, (2:как?)описание принципа обработки, (3:результат)пример данных после обработки + (желательно)как пробовали решить
вот, у вас тут подпись имеется, видимо вас устраивающая, давайте пойдём этим путём.

(1:что?)пример исходных данных
например три файла 1.txt, 2.txt, 3.txt с текстом "System Memory 8192 MB"

(2:как?)описание принципа обработки
awk -f file.awk path\*.txt

(3:результат)пример данных после обработки
хочу вывести на экран информацию в таком виде
файл Х:
память = Y
штук = Z
где X - имя файла, Y - только число без MB, Z - число модулей

(желательно)как пробовали решить
BEGIN { print "файл",ARGV[ARGC-1],":"; c$=0 }
/System Memory/ { print "память =",$3; $c++ }
END { print "штук =",$c }

сейчас вывод на экран такой:
файл 3.txt :
память = 8192
память = 8192
память = 8192
штук = 1

то есть awk принимает *.txt за один поток данных?
при этом $c должен был выдать 3? но он пишет 1. или словно вывод первых двух файлов куда-то затерялся, причем частично. в общем истина где-то рядом.

Добавлено через 37 минут
интересно, если написать вторую строку так
Bash
1
/System Memory/ { $c++; print "память"+$c+" =",$3 }
то на экран будет вывод
файл 3.txt :
1
1
1
штук = 1
0
Marinero
Модератор
Эксперт NIX
2290 / 1848 / 623
Регистрация: 02.03.2015
Сообщений: 6,010
05.10.2019, 09:52 19
Bash
1
2
3
4
5
6
7
8
9
10
11
12
awk '
    BEGINFILE {
        print "файл", FILENAME, ":"
    }
    /System Memory/ {
        print "память =", $3
        c++
    }
    END { 
        print "штук =", c
    }
    ' *.txt
В "старых" реализациях awk нет опции BEGINFILE то можно использовать NR = 1 вместо него.
1
belalugoci
-62 / 62 / 10
Регистрация: 01.06.2018
Сообщений: 766
Завершенные тесты: 1
05.10.2019, 10:17  [ТС] 20
Цитата Сообщение от Marinero Посмотреть сообщение
В "старых"
пробовал в линуксе, там версия 4.1.4, всё работает, а в винде 3.1 версия, там неправильно уже, в общем если и обрабатывать то в линуксе нужно, с виндой и awk будет швах. Спасибо.
0
05.10.2019, 10:17
Answers
Эксперт
37091 / 29110 / 5898
Регистрация: 17.06.2006
Сообщений: 43,301
05.10.2019, 10:17

Как с помощью awk подсчитать количество записей с начала суток?
Есть лог. Пример строки: Jul 24 22:18:48 devmaster syslog-ng: Подскажите...

Вычислить с помощью запроса выражение в поле и вывести его на экран
доброго времени суток! мне нужно вычислить с помощью запроса выражение в поле и вывести его на...

Как с помощью WINAPI организовать ввод IP-адреса в поле EDIT с помощью маски
Привет всем. Помогите пожалуйста. Как с помощью WINAPI организовать ввод в поле EDIT с помощью...


Искать еще темы с ответами

Или воспользуйтесь поиском по форуму:
20
Ответ Создать тему
Опции темы

КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin® Version 3.8.9
Copyright ©2000 - 2019, vBulletin Solutions, Inc.