我试图从列表中提取特定的值。我的输入如下:
link(rel='stylesheet', href='/css/simple.css')
script(type="type/javascript",src="/js/jquery.min.js")
然后我执行以下命令来提取一些数据:
$ cat data.txt
Name: Mike
Age: 20
Date: June 1st
Color: Red
Name: Jon
Age: 22
Date: May 3rd
Color: Blue
Name: Jamie
Age: 18
Date: December 21st
Color: Green
Name: Chris
Age: 24
Date: July 5th
Color: Blue
返回:
grep Name data.txt|cut -c6-20 ; grep Color data.txt|cut -c7-20
我希望它能返回更像这样的东西:
Mike
Jon
Jamie
Chris
Red
Blue
Green
Blue
最后我希望能够指定Color = blue然后输出:
Mike:Red
Jon:Blue
Jamie:Green
Chris:Blue
非常感谢任何帮助完成这项工作。我是新手来编写脚本,并一直试图通过这个和其他网站自学。
提前致谢!
答案 0 :(得分:1)
使用awk你可以做到这一点。
第一项任务:
awk -F' *: *|\n' -v RS= '{print $2 ":" $8}' data.txt
Mike:Red
Jon:Blue
Jamie:Green
Chris:Blue
第二项任务:
awk -F' *: *|\n' -v RS= -v Color=Blue '$8 == Color{print $2}' data.txt
Jon
Chris
答案 1 :(得分:0)
但与unix中的所有内容一样,这样做的方法不止一种。
对于子孙后代,我将提供一个仅限bash的答案。
请注意,bash和awk都不提供多维数组或对象,因此您的数据结构有限。在你的情况下,我将假设"姓名"字段在记录中是唯一的,这意味着它可以像'"主键"一样使用。
我们可以读取您的输入文件并使用密钥填充多个bash数组..好吧,密钥。
#!/usr/bin/env bash
# Note that "declare -A", which sets an associative array, requires bash 4.
declare -A Age Date Color
while IFS=': ' read field value; do
if [ -z "$field" ]; then
continue
elif [ "$field" = Name ]; then
key="$value"
continue
fi
eval $field["\$key"]="\$value"
done < data.txt
这样做的结果是你将拥有一组数组,这些数组的键是数据文件中的名称,其值是这些名称后面的相应字段。
第一项任务:
for Name in "${!Color[@]}"; do
printf "%s:%s\n" "$Name" "${Color[$Name]}"
done
第二项任务:
for Name in "${!Color[@]}"; do
if [ "${Color[$Name]}" = "Blue" ]; then
printf "%s\n" "$Name"
fi
done
请注意"${!Color[@]}"
中的感叹号会导致bash返回索引列表而不是值列表。显然,索引可用于访问值。
显然,不像awk那样简洁,但如果你需要随机访问数组中的数据,那么直接在shell中处理这类事情会非常有用。