Извлечение конкретного текста из текстового файла в UNIX - PullRequest
0 голосов
/ 10 октября 2011

У меня возникли некоторые проблемы со сценариями оболочки UNIX, особенно с чтением файлов.Я хотел бы, чтобы конечный продукт был для сценария, чтобы взять текстовый файл в качестве аргумента командной строки и затем извлечь определенные части для использования в различных операциях.Текстовый файл будет выглядеть так:

ABC12345:John Smith:78
DEF12345:Jane Doe:80
GHI12345:Bob Johnson:91

и будет продолжаться так же с несколькими другими строками.Теперь, что я сделал до сих пор, чтобы извлечь число после последнего двоеточия, здесь в этом фрагменте кода:

case $1 in

   m)cat $2 | while read -r file; do
   #gets the numbers from 0 to 100
   current=grep [0-100]

Оператор case только потому, что в конце пользователь сможет запустить программу иначепути.Однако основная идея в сегменте кода состоит в том, чтобы взять двузначное число в конце строки в текстовом файле и сохранить его в текущей переменной.

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

В любом случае, любая помощь будет отличной!Просто имейте в виду, я очень новичок в этом.

Ответы [ 4 ]

1 голос
/ 10 октября 2011

Попробуйте:

$ while IFS=: read a b c; do echo $c; done < input.txt

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

1 голос
/ 10 октября 2011

Как предполагает Франк, awk или cut будут работать хорошо. Вы также можете использовать массивы IFS и (при условии Bash):

_old_ifs="$IFS"
IFS=":"
ID_NAME_GRADE=( $LINE )
IFS="$_old_ifs"

echo "Hello ${ID_NAME_GRADE[1]}, your grade is ${ID_NAME_GRADE[2]}"
0 голосов
/ 22 декабря 2011

AWk -F: '{print $ NF}' имя_файла

0 голосов
/ 11 октября 2011

Есть много способов извлечь имя и оценку в вашем случае.см. пример:

kent$  cat t
ABC12345:John Smith:78
DEF12345:Jane Doe:80
GHI12345:Bob Johnson:91

#using awk 
kent$  awk -F: '{print "name="$2,", score="$3}' t                                         
name=John Smith , score=78
name=Jane Doe , score=80
name=Bob Johnson , score=91

#using cat
kent$  sed -r 's/[^:]*?:([^:]*):([0-9]*)$/name=\1, score=\2/g' t
name=John Smith, score=78
name=Jane Doe, score=80
name=Bob Johnson, score=91

#or just catch it directly with grep
kent$  grep -Po  "(?<=:)[^:]*(?=:)|(?<=:)\d+$" t
John Smith
78
Jane Doe
80
Bob Johnson
91

cut может сделать это также.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...