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