GNU awk хочет рассматривать аргументы как пути

sed 's/[^0-9]*//g'означает удаление цифр, отличных от -.

Пример

echo alsal34las | sed sed 's/[^0-9]*//g'

получит34

Если вы хотите узнать больше об этом, я предлагаю вам взглянуть на регулярное выражение .

4
08.05.2020, 18:34
2 ответа

Хотя awk предоставляет вам аргументы, вам решать, как манипулировать ими, чтобы получить то, что вы в конечном итоге хотите получить. Например, просто установите аргумент пустым:

if (ARGC>1) {a=ARGV[1]; ARGV[1]=""}
else a=5

В противном случае аргументы имеют свою обычную функцию, которая для параметров, отличных от -, должна быть входными именами файлов. Таким образом, awk попытается прочитать файл «2» и запустить на нем тело скрипта.

5
28.04.2021, 23:15

Когда вы передаете аргумент в awk в командной строке, он предполагает, что вы передаете ему файл, и пытается открыть его. Я действительно не понимаю, чего вы ожидали, так обычно ведет себя awk.

Причина, по которой это работает, если вы удалите { print }, также довольно проста. Если вы удалите его, у вас не останется ничего, кроме блока BEGIN{}, который запускается до того, как будут прочитаны какие-либо входные файлы. Поскольку кроме BEGIN{}ничего нет, нет смысла даже пытаться прочитать файл, и программа завершает работу. В этом легко убедиться с помощьюstrace:

$ strace awk 'BEGIN{a=1}{print}' somefile |& grep 'open.*somefile'
openat(AT_FDCWD, "somefile", O_RDONLY)  = -1 ENOENT (No such file or directory)
write(2, "cannot open file `somefile' for "..., 66cannot open file `somefile' for reading: No such file or directory) = 66

Сравните приведенное выше с:

$ strace awk 'BEGIN{a=1}' somefile |& grep 'open.*somefile'
$ 

Поскольку с файлом ничего не поделаешь, попытка открыть его не предпринимается.


Я думаю, что вы ищете формат foo=bar, который позволяет вам передавать переменную в командной строке:

ls -l|./t.awk a=2

Затем измените свой скрипт на этот:

#!/bin/awk -f
BEGIN {
  if (!a){
    a=5
  }
}

{
  print a,$0
}

И чтобы проиллюстрировать, как это работает:

$ echo foo | t.awk          ## default value
5 foo
$ echo foo | foo.awk a=12   ## value given at launch
12 foo

Кроме того, при запуске непосредственно из командной строки вы также можете использовать параметр -v, чтобы сделать то же самое:

$ awk -v a=12 'BEGIN{print a}'
12
0
28.04.2021, 23:15

Теги

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