Why does this awk script that runs on CentOS not run on Ubuntu?

(для справки, код, вероятно, также здесь: https://github.com/garyexplains/examples который, вероятно, является лучшим источником, чем видео.)


Будет ли какая-либо причина, по которой этот простой скрипт на CentOS не будет работать на Ubuntu?

[nsaunders@rolly awk]$ 
[nsaunders@rolly awk]$ awk -f loop.awk numbers.txt 
1 2 3 
1 2 3 4 5 6 7 
1 2 3 4 5 6 7 8 9 10 11 12 
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 

[nsaunders@rolly awk]$ 
[nsaunders@rolly awk]$ cat loop.awk 
func printlist(n) {
    for(i=1;i<=n;i++) {
        printf("%d ",i)
    }
    printf("\n")
}


{printlist($1)}

[nsaunders@rolly awk]$ 
[nsaunders@rolly awk]$ cat numbers.txt 
3
7
12
15
16
31

[nsaunders@rolly awk]$ 

Я получаю:

awk: loop.awk: line 11: function printlist never defined
awk: loop.awk: line 11: function printlist never defined

awk версия в Ubuntu:

mawk 1.3.4 20200120
Copyright 2008-2019,2020, Thomas E. Dickey
Copyright 1991-1996,2014, Michael D. Brennan

random-funcs:       srandom/random
regex-funcs:        internal
compiled limits:
sprintf buffer      8192
maximum-integer     2147483647

И на машине CentOS:

[nsaunders@rolly ~]$ 
[nsaunders@rolly ~]$ awk -W version
GNU Awk 4.2.1, API: 2.0 (GNU MPFR 3.1.6-p2, GNU MP 6.1.2)
Copyright (C) 1989, 1991-2018 Free Software Foundation.

This program is free software; you can redistribute it and/or modify
it under the terms of the GNU General Public License as published by
the Free Software Foundation; either version 3 of the License, or
(at your option) any later version.

This program is distributed in the hope that it will be useful,
but WITHOUT ANY WARRANTY; without even the implied warranty of
MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
GNU General Public License for more details.

You should have received a copy of the GNU General Public License
along with this program. If not, see http://www.gnu.org/licenses/.
[nsaunders@rolly ~]$ 

не awk в значительной степени awk независимо от того, на какой машине вы работаете?

--- ------121--------844975---- Объединить две команды в одну команду Я ищу способ объединить эти две, чтобы я мог сделать это в один шаг от командной строки. (Я думаю, что% 1 будет в команде.) convert Tess.jpg tess.tif tesseract tess.tif tess For example: ...

I'm looking for a way to combine these two so I can do it in one step from the command line. (I think %1 would be in the command.)

convert Tess.jpg tess.tif
tesseract tess.tif tess

For example:

text2file name of scanned document

This is on Ubuntu MATE.

3
задан 14 June 2020 в 06:13

2 ответа

Вы указали, что хотите иметь возможность запустить

text2file name-of-scanned-document

, чтобы получить эффект от двух команд:

convert Tess.jpg tess.tif
tesseract tess.tif tess

В этом случае вы хотите написать простой скрипт или определить функцию оболочки. Вы упомянули, что думали, что написанное может содержать % 1 . Вот как в пакетном файле Windows (а до этого DOS) использовался первый переданный ему аргумент командной строки, но в Bash позиционные параметры вместо этого $ {1} , $ {2} и т. Д. 1 (со скобками { } необязательно ниже $ {10} ). Поэтому вы должны написать $ 1 , а не % 1 .


Чтобы создать сценарий оболочки, создайте файл с именем, которое вы хотите использовать для команды ( text2file ), с таким содержанием:

#!/bin/bash
convert "$1.jpg" "$1.tiff"
tesseract "$1.tiff" "$1"

$ 1 расширяется до первого аргумента командной строки, переданного сценарию. Это может содержать пробелы, просто убедитесь, что заключили в кавычки при запуске скрипта. Двойные кавычки вокруг $ 1 в самом скрипте предназначены для предотвращения нежелательного разбиения слов и глобализации (которые являются дополнительными расширениями, которые в противном случае были бы выполняется в результате расширения параметра ).

Если вы хотите, чтобы команда tesseract выполнялась только в случае успешного выполнения convert , то вы можете поместить ] && после команды convert :

#!/bin/bash
convert "$1.jpg" "$1.tiff" &&
tesseract "$1.tiff" "$1"

&& не должно быть перед новой строкой, но за ней может следовать одна , если хотите , или вы можете удалить символ новой строки сразу после него, как показано в ответе Гийбы . То есть техника, показанная там, является полностью правильной (хотя она не представлена ​​в контексте написания сценария).

( && один из двух самых популярных способов достижения этого. Другой - set -e , который в этом случае будет работать нормально, но который может быть поразительно неинтуитивным в некоторых из своих эффектов .)

Затем пометьте свой исполняемый скрипт, выполнив:

chmod +x text2file

Затем вы можете запустить скрипт, используя путь к нему, который содержит хотя бы один / . Итак, из того же каталога, в котором находится скрипт:

./text2file name-of-scanned-document

Чтобы иметь возможность запускать его как text2file , и из любого места поместите файл в каталог, указанный в $ PATH переменная окружения. Я рекомендую ~ / bin (т. Е. Каталог bin , расположенный непосредственно в вашем домашнем каталоге). Если этот каталог не существует, вы можете создать его. При всех последующих входах в систему он будет автоматически добавлен в $ PATH , поскольку ~ / .profile содержит код, который проверяет, существует ли ~ / bin , и добавляет его к $ PATH , если это так.

Тогда вы запустите:

text2file name-of-scanned-document

Для приведенного вами примера это просто:

text2file tess

$ 1 расширяется до тесс , когда выполняется таким образом, поэтому вы не должны (и фактически не должны) писать суффикс типа файла после tess при его запуске. Вот пример того, как вы запустите его, когда имя, , два слова , содержит пробел:

text2file 'two words'

Если вместо вас ' Если вы хотите реализовать text2file как функцию оболочки, вы можете поместить это определение внизу ~ / .bashrc :

text2file() {
    convert "$1.jpg" "$1.tiff"
    tesseract "$1.tiff" "$1"
}

Или:

text2file() {
    convert "$1.jpg" "$1.tiff" &&
    tesseract "$1.tiff" "$1"
}

Затем во всех ваших последующих запусках Интерактивные оболочки Bash, это будет доступно. Если вы хотите использовать его в уже запущенной оболочке, вы можете получить исходный код ~ / .bashrc (. ~ / .Bashrc ), или вы можете напрямую запустить определение этой функции (т.е. код, показанный выше) в оболочке.

При использовании интерактивной оболочки Bash вы выполняете ее точно так же, как если бы вы написали ее в виде сценария и поместили в каталог в вашем $ PATH .


1 Технически позиционные параметры сами по себе являются 1 (не $ 1 или $ {1} ), 2 (не $ 2 или $ {2} ) и так далее. Точно так же технически у вас нет переменной окружения $ PATH , так как переменная окружения называется PATH . В отличие от некоторых языков (например, Perl, PowerShell), ведущий $ (и последующее включение { } , если имеется) на самом деле не является частью имени параметра или переменной , но вместо этого используется синтаксис, используемый для запуска расширения параметров.

5
ответ дан 19 June 2020 в 21:25

Как отмечено в ] Руководство пользователя GNU Awk

Во многих реализациях awk, включая gawk, функция ключевого слова может сокращенно func . (ce) Однако, POSIX только определяет использование ключевое слово функция .

Таким образом, ошибка, возможно, связана с тем, что реализация awk в вашей системе Ubuntu - mawk , или что-то подобное (например, Переменная окружения POSIXLY_CORRECT влияет на поведение gawk в вашей системе.

Ubuntu используется для поставки с mawk в качестве значения по умолчанию awk - но, насколько мне известно, все поддерживаемые в настоящее время версии по умолчанию используют gawk . Если вы установили mawk через систему управления packaqge, вы сможете использовать механизм update-alternatives для запроса / установки по умолчанию, например

update-alternatives --query awk

sudo update-alternatives --config awk
------ --- 121 -------- 863369 ----

вы можете использовать && для присоединения к командам терминала:

<command 1> && <command 2> && <command 3>

Так что, если я правильно понимаю, вы хотите:

convert tess.jpg tess.tif && tesseract tess.tif tess
3
ответ дан 19 June 2020 в 21:25

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

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