如何垂直合并通过grep获得的两个字符串?

时间:2019-04-26 17:05:15

标签: bash awk grep

我正在使用grep命令来选择文件中的某些字段。该命令选择N个(在下面的示例中为N = 2)块,每个块由5个以空格分隔的字段,并返回一个包含此字符串的变量,称为firstPart

chr8 aa1 bb1 cc1 dd1 chr8 aa2 bb2 cc2 dd2 

第二次grep执行还返回一个包含N个块的字符串,该块包含5个以空格分隔的字段,称为secondPart,其中包含:

SLC7A2 ee1 ff1 gg1 hhh1 SLC7A2 ee2 ff2 gg2 hhh2

我想知道我可以使用哪个bash命令将firstPartsecondPart放入N个元素的数组中,其中每个元素的第一个块都与其对应的第二个块相关联。输出应为:

chr8 aa1 bb1 cc1 dd1 SLC7A2 ee1 ff1 gg1 hhh1
chr8 aa2 bb2 cc2 dd2 SLC7A2 ee2 ff2 gg2 hhh2

有人知道吗?

2 个答案:

答案 0 :(得分:1)

注意:这是在回答以下问题:“如果我有两个分别由5个空格分隔的单词的 N 个块的字符串,我如何获得N元素的数组,其中每个元素 i 包含第一个字符串和第二个字符串中的 i 块吗?“

不过,几乎可以肯定有一种更好的方法可以解决您的基本问题。具体来说,我的答案与您如何获取字符串完全无关,但是很可能可以通过单个awk命令解决整个问题。

这是我在Bash中解决您实际要求的方法:

#!/usr/bin/env bash

firstPart='chr8 aa1 bb1 cc1 dd1 chr8 aa2 bb2 cc2 dd2'
secondPart='SLC7A2 ee1 ff1 gg1 hhh1 SLC7A2 ee2 ff2 gg2 hhh2'
N=2
for ((i = 0; i < N; ++i)); do
    printf -v arr[i] '%s %s' \
        "$(cut -d ' ' -f $((1 + i * 5))-$((5 + i * 5)) <<< "$firstPart")" \
        "$(cut -d ' ' -f $((1 + i * 5))-$((5 + i * 5)) <<< "$secondPart")"
done

printf '%s\n' "${arr[@]}"

cut命令扩展为类似

cut -d ' ' -f 1-5

对于第一个块,然后

cutd -d ' ' -f 6-10

用于第二个块,依此类推。 printf语句将这些输出合并,并将它们存储在索引为arr的输出数组i中。

输出为

chr8 aa1 bb1 cc1 dd1 SLC7A2 ee1 ff1 gg1 hhh1
chr8 aa2 bb2 cc2 dd2 SLC7A2 ee2 ff2 gg2 hhh2

答案 1 :(得分:1)

几乎可以肯定,有一种更好的方法可以做您想做的事情,但是由于您已经对所问的问题有了答案,因此这是另一种方法:

$ firstPart='chr8 aa1 bb1 cc1 dd1 chr8 aa2 bb2 cc2 dd2'
$ secondPart='SLC7A2 ee1 ff1 gg1 hhh1 SLC7A2 ee2 ff2 gg2 hhh2'

$ read -r -a fp <<< "$firstPart"
$ read -r -a sp <<< "$secondPart"

$ fmt="$(eval "printf '%%s %.0s' {1..$(( ${#sp[@]} / 2 - 1 ))}")%s\n"

$ paste -d' ' <(printf "$fmt" "${fp[@]}") <(printf "$fmt" "${sp[@]}")
chr8 aa1 bb1 cc1 dd1 SLC7A2 ee1 ff1 gg1 hhh1
chr8 aa2 bb2 cc2 dd2 SLC7A2 ee2 ff2 gg2 hhh2