다음 내용이 포함된 파일이 있습니다.
CHROM_POS
chr10_100009635
chr10_100187980
chr10_100229692
chr10_100267650
chr10_100269675
chr10_100279430
chr10_100285899
이 파일에 새 콘텐츠를 추가하고 싶습니다. 예를 들면 다음과 같습니다.
chrX-1, chrX
여기서 X는 위의 숫자를 나타내므로 다음과 같아야 합니다.
chr10_100285898 chr10_100285899
답변1
펄 솔루션:
perl -p -e 's;([^_]+)_(\d+);"$1_" . ($2 - 1) . " $1_$2";e'
이 -p
플래그는 모든 행을 반복하여 -e
스크립트를 인수로 제공합니다. ([^_]+)
활성화 표현식을 대체하기 위해 e` 수정자 앞에 오는 내용을 (\d+) $2 캡처합니다 ._
$1
captures the digits into
, the
입력 파일을 인수로 사용하거나 표준 입력으로 사용하세요.
답변2
사용 awk
:
awk -F _ 'NR > 1 { $0 = sprintf("%s_%d, %s_%d", $1, $2-1, $1, $2) }; 1' file
아니면 조금 더 짧게,
awk -F _ 'NR > 1 { $0 = sprintf("%s_%d, %s", $1, $2-1, $0) }; 1' file
이는 첫 번째 행을 그대로 유지하고 결과 열 사이에 쉼표를 원한다고 가정합니다. sprintf()
쉼표가 필요하지 않은 경우 형식 문자열에서 쉼표를 제거하십시오.
이 코드는 첫 번째 줄에서는 아무 작업도 수행하지 않지만 패턴을 sprintf()
기반으로 다른 모든 줄을 다시 작성하는데 chrX_(N-1), chrX_N
, 이는 정확히 사용자가 요구하는 것 같습니다.
데이터를 두 개의 _
분리된 필드, 즉 염색체 이름과 염색체의 게놈 위치로 처리하여 원래 행의 비트를 선택했습니다. 그래서 염색체 이름은 에서 읽혀지고 $1
, 위치는 에서 읽혀집니다 $2
.
코드의 1
마지막 부분 awk
에서는 데이터(수정 여부에 관계없이)가 출력됩니다.
주어진 샘플 데이터를 출력합니다:
CHROM_POS
chr10_100009634, chr10_100009635
chr10_100187979, chr10_100187980
chr10_100229691, chr10_100229692
chr10_100267649, chr10_100267650
chr10_100269674, chr10_100269675
chr10_100279429, chr10_100279430
chr10_100285898, chr10_100285899
답변3
Awk 기반 솔루션:
awk -F '_' -v OFS=, 'NR>1{ $0 = $1 FS $2-1 OFS $0 }1' file
결과:-
CHROM_POS
chr10_100009634,chr10_100009635
chr10_100187979,chr10_100187980
chr10_100229691,chr10_100229692
chr10_100267649,chr10_100267650
chr10_100269674,chr10_100269675
chr10_100279429,chr10_100279430
chr10_100285898,chr10_100285899
다른 방법:
[펄]
perl -lsne '
print $.>1 ? s/(\d+)$/$1-1/re : (), $_;
' -- -,=, file
[파이썬3]
python3 -c 'import sys
with open(sys.argv[1]) as f:
for nr,_ in enumerate(f,1):
_ = _.rstrip("\n")
if nr > 1:
p = _.find("_") + 1
_ = _[:p] + f"{int(_[p:])-1}," + _
print(_)
' file
[GNU dc] RPN 계산기
< file \
sed 's/^/[/;1s/$/]/;1!s/_/&]/' |
dc -e "
[q]sq
[rdnrd1-n44anrnpc]sp
[?z0=q lpx z0=?]s?
?pc l?x
"
[GNU sed]
sed -Ee '1b
h
s/^[^_]*_//
s/$/\n9876543210/;tdecr
:decr
s/([^0])\n.*\1(.).*/\2/;tdone
s/([^0])(0+\n.*\1(.))/\3_\2/
:loop
s/_0(0*\n)/9_\1/
tloop
s/_.*//
:done
G
s/.*\n([^_]*_)/\1&/
y/\n/,/
' file