我有一个输入文件如下:
some lines with quote and :
AGE:23
some lines with quote and :
NAME:2,0,"My Name Is"
some lines with quote and :
实际上我使用此代码从文件中提取信息:
age="$(cat "$file" | awk -F ':' '/AGE:/ { print $2 }')"
name="$(cat "$file" | awk -F '"' '/NAME:/ { print $2 }' )"
echo "age: $age"
echo "name: $name"
输出:
age: 23
name: My Name Is
我正在寻找一种更好的方法,而不是两次运行cat和awk。我有搜索在一个cat / awk线上做但不能解决它,在这种情况下没有占用?有人能给我一个更好的方法吗?
提前致谢
答案 0 :(得分:3)
while IFS=: read key value; do
case $key in
AGE) age=$value;;
NAME) name=$(awk -F'"' '{print $2}' <<< "$value");;
esac
done < "$file"
答案 1 :(得分:2)
我喜欢@ JohnKugelman的方法,但可以改进:使用冒号和引号作为字段分隔符:
while IFS=':"' read -ra fields; do
case ${fields[0]} in
AGE) age=${fields[1]} ;;
NAME) [[ ${fields[1]} == "2,0," ]] && name=${fields[2]} ;;
esac
done < file
用awk,我写道:
read age name < <(
awk -F '[:,]' '
$1 == "AGE" {printf "%s ",$2}
$1 == "NAME" && $2 == 2 && $3 == 0 {printf "%s ",$NF}
END {print ""}
' filename
)
答案 2 :(得分:1)
如果您的问题中显示的数据很简单。不需要为此使用shell,只需awk就足够了
awk -F '"' '/AGE/{print tolower($0)}/NAME/{print "name:"$2}' input.txt