두 번째 열의 두 번째 콜론 뒤의 모든 항목을 제거하고 나머지는 모두 유지하려면 어떻게 해야 합니까?

두 번째 열의 두 번째 콜론 뒤의 모든 항목을 제거하고 나머지는 모두 유지하려면 어떻게 해야 합니까?

file.bim다음과 같은 약 150만 줄의 파일( )이 있습니다 .

1   1:819959:C:T    0   819959  T   C
1   1:821249:G:A    0   821249  A   G
1   1:821477:A:G    0   821477  G   A
1   1:821843:C:T    0   821843  T   C
1   1:823963:A:C    0   823963  C   A
1   1:824357:C:T    0   824357  T   C
1   1:824398:A:C    0   824398  C   A
1   1:827972:G:A    0   827972  A   G
1   1:828539:A:T    0   828539  T   A

두 번째 열에서 두 번째 콜론과 다음 세 문자를 제거하고 나머지 열을 그대로 유지하고 싶습니다. 원하는 출력은 다음과 같습니다 updated_file.bim.

1   1:819959    0   819959  T   C
1   1:821249    0   821249  A   G
1   1:821477    0   821477  G   A
1   1:821843    0   821843  T   C
1   1:823963    0   823963  C   A
1   1:824357    0   824357  T   C
1   1:824398    0   824398  C   A
1   1:827972    0   827972  A   G
1   1:828539    0   828539  T   A

를 사용해 보았지만 awk여기서는 콜론만 제거되었지만 그 사이의 문자는 그대로 남아 있습니다.

awk -F":" '{ print $1":"$2,$3,$4,$5,$6 }' file.bim > updated_file.bim

답변1

다음 프로그램을 사용할 수 있습니다 awk.

awk '{sub(/:[^:]*:[^:]*$/,"",$2)}1' file.bim > updated_file.bim

또는

awk '{sub(/(:[^:]*){2}$/,"",$2)}1' file.bim > updated_file.bim

이 함수를 사용하여 두 번째 열( ) sub()을 편집하고 마지막 두 열과 그 뒤의 텍스트를 "없음"으로 대체하여 해당 섹션을 효과적으로 제거합니다.$2:

출력 파일을 탭으로 구분해야 하는 경우 awk -v OFS="\t" ' ... '.

또는, 파일이 다음으로 구분된 경우여러 개의 "공간"으로 구성된 그룹구분 기호 형식이 완전히 변경되지 않았는지 확인하려면 다음을 사용할 수 있습니다.

awk '{sub(/:[^:]*:[^: ]* /," ")}1' file.bim > updated_file.bim

:" , 텍스트, :, 텍스트, 공백" 패턴을 찾아 해당 패턴을 단일 "공백"으로 바꿉니다. 입력에서 이 패턴은 열 2의 끝에서만 발생하므로 교체는 해당 열에만 영향을 미칩니다.

마침내, 나중에 언제든지 :두 번째 열의 -로 구분된 필드 수가 변경될 수 있지만 여전히 처음 두 개만 유지하려는 경우 내원래두 번째 열을 첫 번째 열 주변의 텍스트로만 바꾸는 이식성이 떨어지는 변형이지만 :(마지막 두 열 뒤에 "없음"이 있는 텍스트 대신):

awk '{$2=gensub(/([^:]+:[^:]+).*/,"\\1","1",$2)}1' file.bim > updated_file.bim

답변2

두 번째 열의 두 번째 콜론 뒤의 모든 내용을 제거하고 나머지는 모두 유지합니다.

awk '{ c=split($2, s, ":"); $2=s[1] (c>1?":":"") s[2]; }1' infile

아시다시피 이것이 큰 문제가 아닌 경우 두 번째 열을 다시 평가할 때 중복 공백이 제거됩니다. 그렇지 않으면 다음을 sed대안으로 사용하십시오.

sed -E 's/^([^ ]* *)([^: ]*:[^: ]*):[^ ]* (.*)/\1\2 \3/' infile

시험 날짜;

::1   1:81995:9:C:T    0   8::199:59  T   C
1:a:  :1821249GA:    0   821:2:4  A   G
111   1:828539::    0   :::828539  T   A

결과:

::1   1:81995    0   8::199:59  T   C
1:a:  :1821249GA    0   821:2:4  A   G
111   1:828539    0   :::828539  T   A

답변3

GNU sed를 사용하면 다음을 수행할 수 있습니다 \S.

$ sed 's/\(:[^:]*\)\S*/\1/' file
1   1:819959    0   819959  T   C
1   1:821249    0   821249  A   G
1   1:821477    0   821477  G   A
1   1:821843    0   821843  T   C
1   1:823963    0   823963  C   A
1   1:824357    0   824357  T   C
1   1:824398    0   824398  C   A
1   1:827972    0   827972  A   G
1   1:828539    0   828539  T   A

또는 POSIX sed를 사용하십시오.

$ sed 's/\(:[^:]*\)[^[:space:]]*/\1/' file
1   1:819959    0   819959  T   C
1   1:821249    0   821249  A   G
1   1:821477    0   821477  G   A
1   1:821843    0   821843  T   C
1   1:823963    0   823963  C   A
1   1:824357    0   824357  T   C
1   1:824398    0   824398  C   A
1   1:827972    0   827972  A   G
1   1:828539    0   828539  T   A

답변4

먼저 2달러 중에서 원하는 것을 awk선택하세요 . 대신 substr($2, 1, 8)값을 인쇄하십시오 . 따라서 귀하의 코드는 다음과 같습니다.s$2

awk 's = substr($2, 1, 8) {print $1, s, $3, $4, $5, $6}' file
1 1:819959 0 819959 T C
1 1:821249 0 821249 A G
1 1:821477 0 821477 G A
1 1:821843 0 821843 T C
1 1:823963 0 823963 C A
1 1:824357 0 824357 T C
1 1:824398 0 824398 C A
1 1:827972 0 827972 A G
1 1:828539 0 828539 T A

공간을 보존하기 위해 업데이트되었습니다.

awk -F '[[:blank:]]{2,}' '$2 = substr($2, 1, 8) {print $1, $2, $3, $4, $5, $6}' file | column -t
1  1:819959  0  819959  T  C
1  1:821249  0  821249  A  G
1  1:821477  0  821477  G  A
1  1:821843  0  821843  T  C
1  1:823963  0  823963  C  A
1  1:824357  0  824357  T  C
1  1:824398  0  824398  C  A
1  1:827972  0  827972  A  G
1  1:828539  0  828539  T  A

관련 정보