열이 공유 문자열, 다른 숫자, 반복 문자를 공유하는 행을 만들어야 합니다. 내가 원하는 출력은 다음과 같습니다.
SNP1a SNP1b SNP2a SNP2b ... SNP3502a SNP3502b
나는 유닉스/리눅스를 처음 접했기 때문에 내 시도는 매우 초보적입니다. 지금까지 나는 다음을 수행했습니다.
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[ ]
매개변수 확장 플래그를 사용하여 배열 요소 사이에 두 개의 공백을 연결합니다.- 그리고
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};'
이것이 개선될 수 있다는 것은 의심의 여지가 없지만 작업이 완료되었습니다. 이 코드는 Raku의Z
중위 연산자~
, Raku의 (물결표) 문자열 연결 연산자 와 함께 사용됩니다 . 각 식별자는 별도의 줄에 인쇄됩니다. 세 번째 예에서는 @ltr
문자가 $_
(일명 Raku의 테마 변수)에 로드됩니다.
Raku에서 일련의 식별자 문자열을 생성하는 방법에 대한 자세한 내용은 아래 SO 링크를 참조하세요.
https://stackoverflow.com/questions/47999523/concatenating-lists-in-raku?