用于隔离文件中单词的Bash脚本

时间:2015-05-04 11:34:50

标签: linux bash shell terminal

这是我要提取的初始输入数据:

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 个答案:

答案 0 :(得分:2)

假设您的输入文件名为input.txt,只需使用tr命令行工具新行字符替换 space char

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 :(得分:0)

此脚本可以满足您的需求:

#!/bin/bash

a=$@
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