2015-05-04 3 views
1

Вот мои первоначальные входные данные должны быть извлечены:Bash скрипт для выделения слов в файле

david ex1=10 ex2=12 quiz1=5 quiz2=9 exam=99 
judith ex1=8 ex2=16 quiz1=4 quiz2=10 exam=90 
sam ex1=8 quiz1=5 quiz2=11 exam=85 
song ex1=8 ex2=20 quiz2=11 exam=87 

Как извлечь каждое слово быть отформатирован таким образом:

david 
ex1=10 
ex2=12 
etc... 

В конце концов я хотят иметь выход так:

david 12 99 
judith 16 90 
sam 0 85 
song 20 87 

при запуске программы с командами:

./marks ex2 exam < file 

ответ

2

Предположительно ваш входной файл с именем input.txt, просто замените пространство полукокса по новой линии полукокса используя tr инструмент командной строки:

tr ' ' '\n' < input.txt 

Для вашего второго запроса, вы, возможно, придется извлекать конкретные поле на каждой строке, поэтому могут быть полезны команды cut и(обратите внимание, что мой пример, безусловно, является наиболее эффективным):

while read p; do 
    echo -n "$(echo $p | cut -d ' ' -f1) "     # name 
    echo -n "$(echo $p | cut -d ' ' -f3 | cut -d '=' -f2) " # ex2 val 
    echo -n $(echo $p | awk -F"exam=" '{ print $2 }')  # exam val 
    echo 
done < input.txt 
+1

[Бесполезные использование 'cat'] (http://en.wikipedia.org/wiki/Cat_% 28Unix% 29 # Useless_use_of_cat): 'tr '' '\ n' Biffen

+0

@biffen благодарит за это. –

0

Этот скрипт делает то, что вы хотите:

#!/bin/bash 

[email protected] 
awk -v a="$a" -F'[[:space:]=]+' ' 
BEGIN { 
    split(a, b) # split field names into array b 
} 
{ 
    printf "%s ", $1 # print first field 
    for (i in b) { # loop through fields to search for 
     f = 0 # unset "found" flag 
     for (j=2; j<=NF; j+=2) # loop though remaining fields, 2 at a time 
      if ($j == b[i]) { # if field matches value in array 
       printf "%s ",$(j+1) 
       f = 1 # set "found" flag 
      } 
     if (!f) printf "0 " # add 0 if field not found 
    } 
    print "" # add newline 
}' file 

тестирования его

$ ./script.sh ex2 exam 
david 12 99 
judith 16 90 
sam 0 85 
song 20 87 
+0

Спасибо за ответ, к сожалению, я не могу использовать AWK –

+0

Кажется странным требованием, так как awk - правильный инструмент для работы. Это было бы довольно просто реализовать в native bash, но я не вижу преимущества. –

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