Как искать и вырезать строки из файла? [закрыто]

Я пытаюсь написать программу с параметрами и аргументами вроде этого:

./program.sh -f <filename> -string <string>

Предполагается, что программа должна выводить строку <filename>, которая начинается с <string> следующим образом: [ ! d1] grep ^<string> <filename>

Плюс, предполагается, что в следующий примерный входной файл возвращается некоторая информация, связанная со строкой, например имя и возраст:

string name age sex Akdk john 22 male Jrtkfp miah 26 female

Как я могу добиться такого поведения ?

2
задан 12 October 2017 в 15:46

2 ответа

Операция, простая, как это может быть сделано с помощью oneliner, для этого вам не нужен целый скрипт. Я бы воспользовался функцией, которую вы можете поместить в свой файл ~/.bash_aliases, чтобы он загружался в каждый открываемый вами терминал.

function_name(){ awk /^$2/'{print $1": "$2", "$3}' $1 ;}

Это позволяет вам вызвать function_name <filename> <string> и получить результат как как показано ниже:

$ cat test string name age sex Akdk john 22 male Jrtkfp miah 26 female $ function_name test Akdk Akdk: john, 22

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

Пояснения

function_name(){ … ;} - определяет функцию function_name, которая делает … awk /^$2/'{…}' $1 - в файле заданный в качестве первого аргумента функции ($1), найдите строки, которые начинаются (^) со вторым аргументом ($2) с функцией и делают … с ней awk '{print $1": "$2", "$3}' - печатают первый столбец (пробел разделен), затем «:», затем второй столбец, затем «,», а затем третий столбец

NB: Например $1 имеет другое значение для bash (что работает с вашим терминалом), как и для awk: первый расширяет его до первого аргумента, который вы ему дали, второй интерпретирует его как ярлык для первого столбца. Вот почему нам нужны одинарные кавычки (') вокруг команды awk print, таким образом bash не разворачивает $1, но позволяет ему не смотреть на awk для разбора.

6
ответ дан 18 July 2018 в 05:25

Операция, простая, как это может быть сделано с помощью oneliner, для этого вам не нужен целый скрипт. Я бы воспользовался функцией, которую вы можете поместить в свой файл ~/.bash_aliases, чтобы он загружался в каждый открываемый вами терминал.

function_name(){ awk /^$2/'{print $1": "$2", "$3}' $1 ;}

Это позволяет вам вызвать function_name <filename> <string> и получить результат как как показано ниже:

$ cat test string name age sex Akdk john 22 male Jrtkfp miah 26 female $ function_name test Akdk Akdk: john, 22

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

Пояснения

function_name(){ … ;} - определяет функцию function_name, которая делает … awk /^$2/'{…}' $1 - в файле заданный в качестве первого аргумента функции ($1), найдите строки, которые начинаются (^) со вторым аргументом ($2) с функцией и делают … с ней awk '{print $1": "$2", "$3}' - печатают первый столбец (пробел разделен), затем «:», затем второй столбец, затем «,», а затем третий столбец

NB: Например $1 имеет другое значение для bash (что работает с вашим терминалом), как и для awk: первый расширяет его до первого аргумента, который вы ему дали, второй интерпретирует его как ярлык для первого столбца. Вот почему нам нужны одинарные кавычки (') вокруг команды awk print, таким образом bash не разворачивает $1, но позволяет ему не смотреть на awk для разбора.

6
ответ дан 24 July 2018 в 18:19

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

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