두 번째 열에서 두 번째 콜론 뒤의 모든 항목을 제거하고 나머지는 유지하려면 어떻게합니까?
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
답변
다음 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
두 번째 열에서 두 번째 콜론 뒤의 모든 항목을 제거하고 나머지는 모두 유지합니다.
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
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
사용은 모든 빈 공간을 대체 할 나오지도 ":"다음 기각 $ (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
에 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
다음 출력은 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