Не могу получить *только* желаемый результат от команды awk

Я пытаюсь проанализировать файл с помощью awk, чтобы вернуть массив из 4 аргументов в applescript, но не получаю желаемого результата.

Вот команда awk:

awk -F '%' '{if ($1= = "Actions") print ($2 "," $3 "," $4 "," $5)}' "/Users/<my_username>/Desktop/windowInfo.txt"

И вот содержимое файла:

Actions%3773%22%1347%699
Transport%3431%1199%665%97
Undo History%3431%1276%665%164

Лучшее, что мне удалось сделать, это получить 4 аргумента, которые я хочу, разделенные запятыми, но тогда он всегда дополнительно возвращает первый аргумент из следующей строки после новой строки. Даже когда я использую awk -F '%|\n' для включения новой строки в качестве разделителя, он все равно возвращает тот же результат с первым аргументом следующей строки в новой строке.

пример вывода, который я получаю:

3773,22,1347,699
Transport

Я не могу понять, что я делаю здесь не так. Пожалуйста помоги!

В контексте я пытаюсь вызвать это из applescript, используя следующий синтаксис, чтобы вернуть данные о положении и размере окна из текстового файла на основе соответствия имени окна:

repeat with winName in winNames
    set shellCommand to "awk -F '%' '{if ($1==\"" & winName & "\") print $2,$3,$4,$5}' " & filePath
    set {winX, winY, winW, WinH} to (do shell script shellCommand)
    if (winX is not "") and (winY is not "") and (winW is not "") and (WinH is not "") then
        tell application process "Finder"
            set theWindow to (every window whose name is winName)
            if (count of theWindow) > 0 then
                set position of theWindow to {winX, winY}
                set size of theWindow to {winW, winH}
            end if
        end tell
    end if
end repeat

Первая команда awk, которую вы показываете, отличается от команды awk в вашем скрипте applescript. Почему?

Renaud Pacalet 22.04.2024 09:48

У меня есть сильное подозрение, что ваш файл содержит не LF (\n), а только CR (\r). Таким образом, на самом деле он видит одну запись со многими полями, из которых вы печатаете только поля со 2 по 5, где пятое поле имеет вид 699\rtransport. вы могли бы дать определение -v RS = "\r"

kvantour 22.04.2024 10:04

Разве это не дублирующий вопрос? Сохранить/восстановить границы каждого открытого окна по пути/имени

Mockman 22.04.2024 13:44

Не позволяйте какой-либо переменной, оболочке или какой-либо другой, например. winName в сценарии внизу вашего вопроса разверните его, чтобы стать частью сценария awk. См. stackoverflow.com/questions/19075671/…, чтобы узнать, как передать значение переменной в awk.

Ed Morton 22.04.2024 15:58

Команда @Renaud Pacalet немного отличается из-за отсутствия сна/человеческой ошибки, а также из-за того, что я упростил команду для первого примера вместо того, чтобы сначала показывать итеративный контекст.

Max Well 22.04.2024 17:37

@kvantour О боже, ты, наверное, прав! Я даже не подумал попробовать добавить \r. :фейспалм:

Max Well 22.04.2024 17:37

@Mockman нет, это относится к проблеме, связанной с awk, показывая контекст аналогичного использования Applescript, но для другого приложения, чем Finder (REAPER). Кроме того, по вопросу, на который вы ссылаетесь, я был ОП. :)

Max Well 22.04.2024 17:38

@Эд Мортон, спасибо за совет! Я почитаю об этом.

Max Well 22.04.2024 17:38
Стоит ли изучать PHP в 2023-2024 годах?
Стоит ли изучать PHP в 2023-2024 годах?
Привет всем, сегодня я хочу высказать свои соображения по поводу вопроса, который я уже много раз получал в своем сообществе: "Стоит ли изучать PHP в...
Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
В JavaScript одним из самых запутанных понятий является поведение ключевого слова "this" в стрелочной и обычной функциях.
Приемы CSS-макетирования - floats и Flexbox
Приемы CSS-макетирования - floats и Flexbox
Здравствуйте, друзья-студенты! Готовы совершенствовать свои навыки веб-дизайна? Сегодня в нашем путешествии мы рассмотрим приемы CSS-верстки - в...
Тестирование функциональных ngrx-эффектов в Angular 16 с помощью Jest
В системе управления состояниями ngrx, совместимой с Angular 16, появились функциональные эффекты. Это здорово и делает код определенно легче для...
Концепция локализации и ее применение в приложениях React ⚡️
Концепция локализации и ее применение в приложениях React ⚡️
Локализация - это процесс адаптации приложения к различным языкам и культурным требованиям. Это позволяет пользователям получить опыт, соответствующий...
Пользовательский скаляр GraphQL
Пользовательский скаляр GraphQL
Листовые узлы системы типов GraphQL называются скалярами. Достигнув скалярного типа, невозможно спуститься дальше по иерархии типов. Скалярный тип...
1
9
66
1
Перейти к ответу Данный вопрос помечен как решенный

Ответы 1

Ответ принят как подходящий

На машинах Unix/Linux именные файлы заканчиваются на \n. Где в MacOS они заканчиваются на \r. На машинах с Windows они используют \r\n. Поскольку awk имеет разделитель записей по умолчанию \n, он находит только одну запись, то есть полный файл.

Чтобы решить вашу проблему, вам необходимо добавить:

awk 'BEGIN{RS=ORS = "\r";FS = "%"; OFS = ","}($1= = "Actions"){print $2,$3,$4,$5}' /path/to/file

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

tripleee 22.04.2024 12:38

Окончания строк на Mac на самом деле тоже \n по умолчанию, и внутри оболочки именно такой результат и должен быть. Однако когда do shell script был реализован, ситуация была более мрачной, и поэтому он изменяет то, что возвращает скрипт. В итоге Apple добавила опцию, altering line endings которая позволяет вам решить, как вы хотите do shell script вернуть результат. Чтобы получить \n, добавьте without altering line endings к команде. Лично мне бы хотелось, чтобы они сделали наоборот, но…

Mockman 22.04.2024 13:25

@tripleee, в моем случае я использую один и тот же старый Mac и ОС в течение «долгого времени» (MBP Retina, macOS Sierra, с 2017 года), поэтому старые соглашения все еще применимы ко мне.

Max Well 22.04.2024 17:42

@Mockman Полезно знать. Еще раз спасибо!

Max Well 22.04.2024 17:44

Другие вопросы по теме