我需要创建一个单独的行,其中的列具有一个共享的字符串、不同的数字和共享重复的字母。我想要的输出如下:
SNP1a SNP1b SNP2a SNP2b ... SNP3502a SNP3502b
我刚开始使用unix/linux,所以我的尝试还不成熟。到目前为止,我已经做了:
seq -f "SNP%1g" 1 3502 > header
awk '{print;print;}' header > header2
因此,header2
是:
SNP1
SNP1
SNP2
SNP2
...
SNP3502
SNP3502
但是,我在如何在每一行中添加一个交替的a
和b
方面陷入了困境。
任何帮助都将不胜感激!
发布于 2022-06-16 15:02:30
使用bash
:
printf '%s ' SNP{1..3502}{a..b}
如果最后一个尾随空间是一个问题,则将其包装在一个函数中:
headers(){
local pieces=( SNP{1..3052}{a..b} ) IFS=' '
printf '%s' "${pieces[*]}" # add '\n' to get new line at the end
}
发布于 2022-06-16 22:45:46
对于任何ksh、bash或zsh,只需使用echo:
$ echo SNP{1..3502}{a,b} # {a..b} also works here.
SNP1a SNP1b SNP2a SNP2b SNP3a SNP3b SNP4a SNP4b SNP5a .....
在这种情况下,echo
是非常好的,因为在生成的列表中没有前导“-”,也没有特殊的字符。
如果必须使用printf
,请尝试:
printf '%s\n' SNP{1..3}{a,b} | paste -s -d ' ' -
如果必须使用awk,则使用埃德·莫顿的回答
发布于 2022-06-16 15:49:24
在每个Unix框上使用任何shell中的任何awk:
awk '
BEGIN {
n = split("a b", lets)
for ( i=1; i <= 5; i++ ) {
for ( j=1; j <= n; j++ ) {
printf "%sSNP%d%s", sep, i, lets[j]
sep = OFS
}
}
print ""
}
'
SNP1a SNP1b SNP2a SNP2b SNP3a SNP3b SNP4a SNP4b SNP5a SNP5b
https://unix.stackexchange.com/questions/706420
复制相似问题