2011-10-10 5 views
0

У меня возникли проблемы с сценарием оболочки UNIX, в частности, с чтением файлов. Я хотел бы, чтобы конечный продукт был для сценария, чтобы взять текстовый файл в качестве аргумента командной строки, а затем извлечь определенные части для использования в различных операциях. Текстовый файл будет выглядеть так:Извлечение определенного текста из текстового файла в 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] 

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

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

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

+4

Вы должны взглянуть на awk или разрезать. Он позволяет распечатывать столбцы. Чтобы получить имя в середине, это может быть так же просто, как cut -d: -f2 – frankc

+0

Возможный дубликат [Разделить строку на основе разделителя в bash?] (Http://stackoverflow.com/questions/918886/split-string -На-на-разделитель-в-Баш) –

ответ

1

Как предлагает frankc, 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]}" 
1

Попробуйте это:

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

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

0

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

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 

разрез можно сделать.

Смежные вопросы