我正在使用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命令将firstPart
和secondPart
放入N个元素的数组中,其中每个元素的第一个块都与其对应的第二个块相关联。输出应为:
chr8 aa1 bb1 cc1 dd1 SLC7A2 ee1 ff1 gg1 hhh1
chr8 aa2 bb2 cc2 dd2 SLC7A2 ee2 ff2 gg2 hhh2
有人知道吗?
答案 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