Я не знаю, что происходит с вашим файловая система монтируется, но обойти это очень просто. Вам просто нужно понять, что на самом деле делает шебанг.
Когда файл помечен как исполняемый и вы пытаетесь запустить его, проверяются первые два байта файла. Если они #!
, то оболочка выполнит эту первую строку вашего файла как команду, за которой следует путь к самому файлу в качестве аргумента этой команды.
Другими словами, #! / Bin / bash
, помещенный в качестве первой строки в файл с именем /tmp/myscript.sh
, будет выполняться как / bin / bash /tmp/myscript.sh
.
Аналогично, #! / Usr / bin / awk -f
как первая строка ./ awkTest.awk
при запуске становится (или должен стать, если проблема с монтированием не мешала) / usr / bin / awk -f ./awkTest.awk
.
Решение состоит в том, чтобы просто запустить awk -f awkTest.awk
, и ваш сценарий будет работать должным образом.
Обратите внимание, что поскольку awk
интерпретируется , а не компилируется, флаг noexec
в параметрах монтирования устройства, на котором хранится ваш сценарий awk , выиграл 't не мешает вам запустить ваш скрипт. Это только мешает вам запустить его как исполняемый файл . Итак, все, что вам нужно сделать, это запустить двоичный исполняемый файл awk
( / usr / bin / awk
), и он прочитает ваш awk
script, что, конечно, не предотвращается флагом noexec
, и он будет делать то, что вы написали.
RudiC показывает, как преобразовать файл. Чтобы сохранить его обратно в тот же файл:
с помощью GNU awk:
gawk -i inplace '...' file
используяsponge
из пакета moreutils
:
awk '...' file | sponge file
Или с помощью временного файла
tmp=$(mktemp)
awk '...' file > "$tmp" && mv "$tmp" file
Как насчет
awk -F"\t" '
NR == 1 {$2 = "datetime" OFS "monthyear" OFS "time"
}
NR > 1 {split ($2, T, "[/ ]")
$2 = $2 OFS T[1] "/" T[3] OFS T[4]
}
1
' OFS="\t" file
id datetime monthyear time userId itemId
1 12/1/17 8:32 12/17 8:32 2232 tv
2 1/12/18 10:18 1/18 10:18 3232 fdfs
3 2/9/18 10:50 2/18 10:50 232 fdsf
4 3/6/18 12:35 3/18 12:35 345456 fdg