列が共有文字列、異なる数字、繰り返し文字を共有する行を作成する必要があります。私が望む出力は次のとおりです。
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
どんな助けでも大変感謝します!
答え1
シェルを含むzsh
:
() { print ${(j[ ])@}; } SNP{1..3502}{a,b}
どこ:
SNP{1..3502}{a,b}
中かっこ拡張を使用したリストの生成$@
別名$argv
配列としてリストを使用できる匿名関数に渡されます。j[ ]
パラメータ拡張フラグを使用して、配列要素間に2つのスペースを連結します。- そして
print
それを印刷した人に渡してください。
他のシェルから:
zsh -c '() { print ${(j[ ])@}; } SNP{1..3502}{a,b}'
数字、プレフィックス、サフィックスのリストが別々の配列にある場合:
pre=( SNP )
num=( {1..3502} )
suf=( a b )
() { print ${(j[ ])@}; } $^pre$^num$^suf
そしてperl
:
perl -le 'print join " ", map {$n=$_; map "SNP$n$_", qw(a b)} (1..3502)'
答え2
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を使用する必要がある場合は、以下を使用してください。エドモートンの答え
答え3
そして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
}
答え4
使用幸せ(以前のPerl_6)
raku -e 'my @nbr = "SNP" xx 3502 Z~ 1..3502; \
for @nbr -> $i {put $i ~ "a"; put $i ~ "b"};'
または
raku -e 'my @nbr = "SNP" xx 3502 Z~ 1..3502; my @ltr = "a".."b"; \
for @nbr -> $i {put $i ~ @ltr[0]; put $i ~ @ltr[1]};'
または
raku -e 'my @nbr = "SNP" xx 3502 Z~ 1..3502; my @ltr = "a".."b"; \
for @nbr -> $i {put $i ~ $_ for @ltr};'
これを改善できることは間違いありませんが、作業は完了しました。このコードはラクZ
中位演算子~
、Rakuの(チルダ)文字列連結演算子で使用されます。各識別子は別々の行に印刷されます。 3番目の例では、@ltr
文字が$_
(別名Rakuのテーマ変数)にロードされます。
Rakuで一連の識別子文字列を生成する方法の詳細については、以下のSOリンクを参照してください。
https://stackoverflow.com/questions/47999523/concatenating-lists-in-raku?