BASH将文本文件操作到数组中

时间:2018-01-29 15:29:46

标签: bash awk sed grep

我有一个文本文件(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)

有人可以建议怎么做吗?

由于

3 个答案:

答案 0 :(得分:3)

不需要任何外部命令 - awksed grep - 此处;所有必要的原语都可以用于bash本身。

array=( )
while IFS='",' read -r num userid access_code _; do
  if [[ $userid =~ (G2|Y5) ]]; then
    array+=( "${userid} (${access_code})" )
  fi
done < clients

请参阅:

答案 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[@]}"