파일의 각 줄에 새 요소를 추가하는 방법

파일의 각 줄에 새 요소를 추가하는 방법

다음 내용이 포함된 파일이 있습니다.

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 캡처합니다 ._$1captures 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

관련 정보