2015-05-04 39 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 

对于你的第二个要求,你可能要提取特定因此cutawk命令可能很有用(请注意,我的示例肯定是可以改进的):

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是工作的正确工具。这在本地bash中实现相当简单,但我没有看到优势。 –