Я запускаю команду для переформатирования моего текстового файла:

awk -F, '{if ($6<0) print $1$2,"   "$3$4,$5$6;
               else print $1$2,"   "$3$4$5,$6;}' filename.txt > seqXXX.txt

Как я могу превратить это в скрипт, чтобы мне не приходилось каждый раз вводить команду? Я прочитал несколько статей о том, как это сделать, но еще больше запутался

0
terdon 22 Дек 2019 в 17:43
2
Добро пожаловать в StackExchange. Пожалуйста, рассмотрите возможность принятия ответа Кусалананды, если он решит вашу проблему, представленную в исходном сообщении. Вы принимаете ответ, проверяя зеленую метку слева от него. Принятие ответа сигнализирует другим, кто просматривает форум, что ответ удовлетворительный.
 – 
Cbhihe
22 Дек 2019 в 14:12

1 ответ

Лучший ответ

Как это сделать, отчасти зависит от того, какую часть команды вы хотите превратить в сценарий. Я даю вам три варианта ниже:

  1. Сама программа awk как скрипт.
  2. Команда в целом как скрипт.
  3. Команда как функция оболочки.

Программу awk можно превратить в скрипт, который выглядит как

#!/usr/bin/awk -f

BEGIN { FS = "," }

{
    if ($6 < 0)
        print $1$2,"   "$3$4,$5$6
    else
        print $1$2,"   "$3$4$5,$6
}

Это сначала устанавливает разделитель полей в запятую, а затем запускает блок кода в каждой строке ввода.

Используемая здесь строка #! делает так, что когда вы запускаете файл скрипта, он будет выполняться так, как если бы вы написали awk -f script.awk в командной строке. Путь, используемый в первой строке, должен быть скорректирован так, чтобы он указывал на правильный интерпретатор awk в вашей системе (см. вывод command -v awk).

После того, как этот файл станет исполняемым с помощью chmod +x script.awk, он будет использоваться как

$ ./script.awk filename.txt >seqXXX.txt

Команду можно поместить в сценарий оболочки следующим образом:

#!/bin/sh

awk -F, '{if ($6<0) print $1$2,"   "$3$4,$5$6;
               else print $1$2,"   "$3$4$5,$6;}' "$@"

Здесь я просто пересадил команду в сценарий оболочки. Бит "$@" в конце команды awk будет заменен всеми аргументами командной строки, которые вы передаете сценарию (возможно, только именем вашего единственного входного файла).

После создания этого исполняемого файла вы будете использовать его как

$ ./script.sh filename.txt >seqXXX.txt

Если имена файлов статические и никогда не изменятся, поместите их также в скрипт:

#!/bin/sh

awk -F, '{if ($6<0) print $1$2,"   "$3$4,$5$6;
               else print $1$2,"   "$3$4$5,$6;}' filename.txt >seqXXX.txt

А затем вызовите свой скрипт без лишних аргументов и перенаправлений в командной строке.


Вы можете превратить свою команду в функцию оболочки. Это почти как псевдоним, но в целом немного более гибкий:

myreformat () {
    awk -F, '{if ($6<0) print $1$2,"   "$3$4,$5$6;
                   else print $1$2,"   "$3$4$5,$6;}' "$@"
}

Это будет происходить везде, где вы обычно размещаете псевдонимы оболочки и т. д. (возможно, в ~/.bashrc, если вы используете оболочку bash). Функция будет доступна в следующем сеансе оболочки, который вы запустите.

Он будет вызываться почти так же, как вариант сценария оболочки выше:

$ myreformat filename.txt >seqXXX.txt
5
Kusalananda 22 Дек 2019 в 15:48
У нас есть прекрасный пример того, почему расширения файлов — плохая идея: 3 реализации и 3 имени файла. Если бы вы изменили реализацию и, следовательно, имя файла, вам пришлось бы изменить каждый скрипт, который его использовал. Однако если бы у вас не было расширения имени файла, то имя не изменилось бы, и все скрипты, которые его используют, продолжали бы работать.
 – 
ctrl-alt-delor
22 Дек 2019 в 19:48
@ctrl-alt-delor Хотя этот вопрос не о суффиксах имен файлов, моя основная причина их использования — избежать конфликтов имен с уже существующими вещами, такими как script (в этом конкретном примере) или test и т. д. Они предлагают своего рода «пространство имен» для личных скриптов. Скрипты, установленные для всей системы, - это другое дело.
 – 
Kusalananda
22 Дек 2019 в 19:51
Вот почему . никогда не должно быть в вашем PATH. Если вы помещаете их в одну из корзин как функцию, тогда да, есть пространство имен, но будьте честны (например, my-script).
 – 
ctrl-alt-delor
22 Дек 2019 в 19:55