我有一个文本文件(clients)
,其中包含大约150行信息
每一行类似于:
“2”, “USERID”, “ACCESSCODE” 的例如
"1","545ghu","7687686686868709ioo98968g"
"1","G2567u","54564df76786470976476987w"
"1","Y5po97","iuioubhjgjg768b79j9890980"
我想grep这个文件,只在第二列中找到包含G2或Y5的条目,删除所有双引号并将结果发送到数组。
我可以用
做到这一点 foo=( $(grep 'G2\|Y5' clients | sed 's/"//g') )
数组foo
中的结果包含以下条目:
foo[0]
= 1,G2567u,54564df76786470976476987w
我想要的是foo
看起来像这样的结果:
G2567u (54564df76786470976476987w)
有人可以建议怎么做吗?
由于
答案 0 :(得分:3)
不需要任何外部命令 - awk
,sed
或 grep
- 此处;所有必要的原语都可以用于bash本身。
array=( )
while IFS='",' read -r num userid access_code _; do
if [[ $userid =~ (G2|Y5) ]]; then
array+=( "${userid} (${access_code})" )
fi
done < clients
请参阅:
hosts=( $(aws ...) )
为反模式的原因答案 1 :(得分:1)
awk
使用readarray
进行文本操作(以及关注点分离),以将输出转换为bash
数组
简化解析,将quote和逗号设置为字段分隔符,这将更改字段索引。
$ readarray ar < <(awk -F'[",]' '$5~/G2|Y5/{print $5,"("$8")"}' file)
$ echo "${ar[0]}"
G2567u (54564df76786470976476987w)
另外,也许您正在寻找 以 开头,而不是 包含 来获取特殊值。在这种情况下,为了消除误报,将条件更改为$5~/^(G2|Y5)/
答案 2 :(得分:0)
我尝试使用bash字符串切片,while循环将数据提取到bash数组中。
declare -a arr
while IFS="\r\n" read -r line; do
# replace "," to | as field delimiter
line="${line//\",\"/|}"
# remove "
line="${line//\"/}"
# remove first field via delimiter |
line="${line#*|}"
# extract userid
userid="${line%%|*}"
if [[ "${userid}" =~ (G2|Y5) ]]; then
# extract access_code
access_code="${line##*|}"
# arr+=( "${userid} (${access_code})" )
arr[${#arr[@]}]="${userid} (${access_code})"
fi
done < <(echo "${clients}")
# done < /PATH/clients.txt
echo "${arr[@]}"
echo "${#arr[@]}"