특정 문자를 기준으로 열을 두 개의 열로 분할하는 방법은 무엇입니까?

특정 문자를 기준으로 열을 두 개의 열로 분할하는 방법은 무엇입니까?

데이터세트의 다른 모든 열/데이터를 유지하면서 데이터세트의 한 열을 두 개의 열로 분할하고 싶습니다.

예를 들어 내 데이터는 다음과 같습니다(...더 많은 열을 나타내며 데이터 세트가 매우 큽니다).

Gene   qval    ...  Chromosome Position
ACE    0.3748  ...    1:234689650
NOS    0.2     ...    2:374896578
BRCA   0.345   ...    12:897655323

:염색체 위치를 기준으로 염색체 위치 열을 다음과 같이 나누고 싶습니다 .

Gene   qval    ...   Chromosome    Position
ACE    0.3748  ...    1            234689650
NOS    0.2     ...    2            374896578
BRCA   0.345   ...    12           897655323

지금까지 시도한 것은 새 열을 생성하지 않거나 데이터세트의 나머지 부분을 손상시켜 엉망이 되거나 제자리에서 벗어나 첫 번째 Chromsome열이 이상한 염색체 번호로 표시되도록 만드는 것 같지만 더 큰 Position숫자(두 번째 열 I) 만들려고 했으나 사라졌습니다.

예를 들어 저는 3가지 방법을 시도했습니다.

awk 'sub(/\:/," "){$1=$1}1' OFS="\t" file1.txt > file2.txt #displaces columns and removes position column

tr ':' $' ' < file1.txt > file2.txt  #removes : but doesn't divide into 2 columns

sed 's/:/ /g' < file1.txt > file2.txt  #removes : but doesn't divide into 2 columns

비슷한 질문을 바탕으로 이와 같은 코드를 시도했지만 대부분은 열을 구분 기호로 분할하는 대신 열을 반으로 자르고 아래쪽 절반을 새 열로 옮기기를 원합니다.

내 데이터는 탭으로 구분된 파일에 있습니다. 나는 Linux를 처음 접했기 때문에 틀릴 수 있지만 내 sed 코드 에는 tr탭 구분 기호로 숫자 사이에 새로 배치된 공백을 고려할 때 분할이 완료되었음을 나타내는 명령이 필요하므로 새 열로 처리됩니까?

답변1

밀러 사용(https://github.com/johnkerl/miller) 그리고 실행

mlr --tsv nest --explode --values --across-fields --nested-fs ":" -f "Chromosome Position" \
then rename "Chromosome Position_1",Chromosome,"Chromosome Position_2",Position input.tsv >output.tsv

당신은 할 것

+------+--------+------------+-----------+
| Gene | qval   | Chromosome | Position  |
+------+--------+------------+-----------+
| ACE  | 0.3748 | 1          | 234689650 |
| NOS  | 0.2    | 2          | 374896578 |
| BRCA | 0.345  | 12         | 897655323 |
+------+--------+------------+-----------+

답변2

데이터가 탭으로 구분된 경우 콜론을 탭으로 바꿉니다.

tr : $'\t' < file

배쉬를 사용하여ANSI-C 인용문

답변3

콜론을 공백으로 바꾸는 것 외에 첫 번째 접근 방식에 어떤 문제가 있습니까 <TAB>? 적응해 보세요:

awk '{sub (/:/, OFS)} 1' OFS="\t" file

관련 정보