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

Nov 19 2020

file.bim약 1.5 밀의 파일 ( )이 있습니다. 다음과 같은 줄 :

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

답변

2 AdminBee Nov 19 2020 at 18:20

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

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

또는

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

sub()함수를 사용하여 두 번째 열 ( $2) 을 편집하여 마지막 두 개와 :그 뒤에 오는 텍스트를 "nothing" 으로 바꾸어 해당 부분을 효과적으로 제거합니다.

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

또는 파일이 둘 이상의 "공백"그룹으로 구분되고 구분 기호 형식이 완전히 변경되지 않았는지 확인하려면 다음을 사용할 수 있습니다.

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

패턴 " :, 다음에 텍스트, 뒤에 :텍스트, 공백"이 오는 패턴을 찾아 단일 "공백"으로 대체합니다. 입력에서이 패턴은 열 2의 끝에서만 발생하므로 대체는 해당 열에 만 영향을줍니다.

마지막으로 , 미래에 :두 번째 열에서 분리 된 필드 의 수가 변경 될 수 있지만 여전히 처음 두 개만 유지하려는 경우 이식성이 떨어지지 만 원래 변형에 의지 할 수 있습니다. 첫 번째 주위의 텍스트 만 :( "nothing"이있는 마지막 두 뒤에있는 텍스트 대신) :

awk '{$2=gensub(/([^:]+:[^:]+).*/,"\\1","1",$2)}1' file.bim > updated_file.bim
2 αғsнιη Nov 19 2020 at 18:45

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

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
1 EdMorton Nov 20 2020 at 06:59

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
RedaSalih Nov 19 2020 at 18:07

사용은 모든 빈 공간을 대체 할 나오지도 ":"다음 기각 $ (6)$ (7 개) 의 내용에 필드를 넣어 $ 4$ (5)$ (5) AWK와를 :

sed  's/ /:/g' bim | awk  -F':' '{ $6=""; $7="" ; $4=$4$5; $5="" }1' > updated_file.bim 

SED없이 :

awk  '{ gsub(/ /,":",$0); FS=":";$6=""; $7="" ; $4=$4$5; $5="" }1' bim > updated_file.bim 
CarlosPascual Nov 19 2020 at 19:05

awk와 처음으로 substr($2, 1, 8)당신이 당신이 필요 $ (2)로부터 선택합니다. 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
codeholic24 Nov 19 2020 at 19:16

다음 출력은 sed명령 을 사용하여 얻을 수 있습니다.

cat file.bim | sed 's/:[a-zA-Z]//g' >> updated_file.bim

or

cat file.bim | sed 's/:[[:alpha:]]//g' >> 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