Bash 用于隔离文件中单词的脚本
Bash script to isolate words in a file
这是我要提取的初始输入数据:
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
假设您的输入文件名为 input.txt
,只需将 space char 替换为 new line char 使用tr 命令行工具:
tr ' ' '\n' < input.txt
对于您的第二个请求,您可能必须在每一行中提取特定字段,因此 cut
和 awk
命令可能会有用(请注意,我的示例当然可以改进):
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 }') # exam val
echo
done < input.txt
此脚本可以满足您的需求:
#!/bin/bash
a=$@
awk -v a="$a" -F'[[:space:]=]+' '
BEGIN {
split(a, b) # split field names into array b
}
{
printf "%s ", # 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
这是我要提取的初始输入数据:
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
假设您的输入文件名为 input.txt
,只需将 space char 替换为 new line char 使用tr 命令行工具:
tr ' ' '\n' < input.txt
对于您的第二个请求,您可能必须在每一行中提取特定字段,因此 cut
和 awk
命令可能会有用(请注意,我的示例当然可以改进):
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 }') # exam val
echo
done < input.txt
此脚本可以满足您的需求:
#!/bin/bash
a=$@
awk -v a="$a" -F'[[:space:]=]+' '
BEGIN {
split(a, b) # split field names into array b
}
{
printf "%s ", # 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