데이터세트의 다른 모든 열/데이터를 유지하면서 데이터세트의 한 열을 두 개의 열로 분할하고 싶습니다.
예를 들어 내 데이터는 다음과 같습니다(...더 많은 열을 나타내며 데이터 세트가 매우 큽니다).
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
답변3
콜론을 공백으로 바꾸는 것 외에 첫 번째 접근 방식에 어떤 문제가 있습니까 <TAB>
? 적응해 보세요:
awk '{sub (/:/, OFS)} 1' OFS="\t" file