Я пытаюсь проанализировать файл с помощью 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
У меня есть сильное подозрение, что ваш файл содержит не LF
(\n
), а только CR
(\r
). Таким образом, на самом деле он видит одну запись со многими полями, из которых вы печатаете только поля со 2 по 5, где пятое поле имеет вид 699\rtransport
. вы могли бы дать определение -v RS = "\r"
Разве это не дублирующий вопрос? Сохранить/восстановить границы каждого открытого окна по пути/имени
Отвечает ли это на ваш вопрос? AppleScript: сохранение/восстановление границ каждого открытого окна по пути/имени
Не позволяйте какой-либо переменной, оболочке или какой-либо другой, например. winName
в сценарии внизу вашего вопроса разверните его, чтобы стать частью сценария awk. См. stackoverflow.com/questions/19075671/…, чтобы узнать, как передать значение переменной в awk.
Команда @Renaud Pacalet немного отличается из-за отсутствия сна/человеческой ошибки, а также из-за того, что я упростил команду для первого примера вместо того, чтобы сначала показывать итеративный контекст.
@kvantour О боже, ты, наверное, прав! Я даже не подумал попробовать добавить \r. :фейспалм:
@Mockman нет, это относится к проблеме, связанной с awk, показывая контекст аналогичного использования Applescript, но для другого приложения, чем Finder (REAPER). Кроме того, по вопросу, на который вы ссылаетесь, я был ОП. :)
@Эд Мортон, спасибо за совет! Я почитаю об этом.
На машинах 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 использовала это соглашение для текстовых файлов. Если это сработает, отлично; но похоже, что это по сути отсутствие репродукции.
Окончания строк на Mac на самом деле тоже \n
по умолчанию, и внутри оболочки именно такой результат и должен быть. Однако когда do shell script
был реализован, ситуация была более мрачной, и поэтому он изменяет то, что возвращает скрипт. В итоге Apple добавила опцию, altering line endings
которая позволяет вам решить, как вы хотите do shell script
вернуть результат. Чтобы получить \n
, добавьте without altering line endings
к команде. Лично мне бы хотелось, чтобы они сделали наоборот, но…
@tripleee, в моем случае я использую один и тот же старый Mac и ОС в течение «долгого времени» (MBP Retina, macOS Sierra, с 2017 года), поэтому старые соглашения все еще применимы ко мне.
@Mockman Полезно знать. Еще раз спасибо!
Первая команда
awk
, которую вы показываете, отличается от командыawk
в вашем скрипте applescript. Почему?