2013-04-29 2 views
1

В моем сценарии оболочки Bash я хотел бы прочитать определенную строку из файла; который делится на : и назначает каждый раздел переменной для последующей обработки.Чтение слов в определенной строке в текстовом файле с использованием сценария оболочки

Например, я хочу, чтобы прочитать слова, найденные в строке 2. Текст файла:

abc:01APR91:1:50 
Jim:02DEC99:2:3 
banana:today:three:0 

После того, как у меня «читать» линия 2, я должен быть в состоянии повторить значения, как-то вроде этого:

echo "$name"; 
echo "$date"; 
echo "$number"; 
echo "$age"; 

выход будет:

Jim 
02DEC99 
2 
3 
+0

[bash split string into array] (http://stackoverflow.com/q/10586153) –

ответ

0

Вы можете использовать это:

read name date number age <<< $(awk -F: 'NR==2{printf("%s %s %s %s\n", $1, $2, $3, $4)}' inFile) 

echo "$name" 
echo "$date" 
echo "$number" 
echo "$age" 
5

Для повторив одну строку файла, я совсем как sed:

$ IFS=: read name date number age < <(sed -n 2p data) 
$ echo $name 
Jim 
$ echo $date 
02DEC99 
$ echo $number 
2 
$ echo $age 
3 
$ 

Это использует process substitution, чтобы получить выход sed к команде read. Команда sed использует опцию -n, поэтому она не печатает каждую строку (как и по умолчанию); 2p означает «когда это строка 2, напечатайте строку»; data - это просто имя файла.

+0

Кстати, одним из преимуществ этого метода является то, что если имя «Джим Кеннеди» вместо «Джима», это получает правильное значение в '$ name'. Другие ответы будут иметь проблемы с тем, что «Кеннеди» - это дата, «02DEC99» - это число, а «2 3» - возраст. –

+0

Заинтригован вашим отличным модификатором сериала -n 2p, но не смог найти его в документации. Нашли это объяснение: http://stackoverflow.com/a/1429628/1207958 – svante

+1

@svante: Я практикую DRY - не повторяйте себя. : D Я добавлю некоторые комментарии, чтобы объяснить команду 'sed'. –