필드를 공유하는 다른 파일의 해당 문자열을 한 파일에 추가하려면 어떻게 해야 합니까?

필드를 공유하는 다른 파일의 해당 문자열을 한 파일에 추가하려면 어떻게 해야 합니까?

"종양 ID" 필드가 있는 두 개의 파일이 있습니다. 둘 다 쉼표로 구분됩니다. 파일 2의 고유 필드를 파일 1에 추가해야 하며 "종양 ID"의 해당 문자열을 기반으로 해당 필드에 대한 행을 추가하고 싶습니다. 예시 형식은 다음과 같습니다.

파일 1

Tumor_ID, Chromosome, start, end,
xxxxx,       2,        12,    13,
xxxxx,       3,        45,    46,
xxxxx,       3,        48,    49
xxxxx,       3,        51,    52,
nnnnn,       5,       55,    59,
nnnnn,       5,       57,    58,
lllll,      11,       13,    14,
lllll,      12,        16,    17,
eeeee,       2,        51,    52,
zzzzz,       9,      1000,   101,

파일 2

Patient_No., Tumor_ID,  Normal_ID, 
4,            xxxxx,     hhhhh,            
5,            nnnnn,     aaaaa,          
8,            lllll,     ddddd,     
7,            eeeee,     ggggg,     
3,            zzzzz,     nnnnn,      

파일 1에서 새 필드(예: -f15)를 생성하고 파일 2의 Normal_ID 값을 새로 생성된 파일 1 필드의 해당 Tumor_ID 값에 할당하려면 어떻게 해야 합니까? 내 질문이 이해가 되나요?

답변1

이는 효과적인 솔루션이지만 추가 개선이 필요할 수 있습니다.

데이터를 쉼표로 구분하기 위해 file2의 모든 공백과 탭을 제거했습니다. 이것은 쉽게 할 수 있습니다

tr -d " " <file2 > file-b

또한 초기 값이 NA인 file1(현재는 file-a라고 함)에 새 자리 표시자 필드 번호 5를 추가했습니다.

이는 다음을 통해 수행할 수 있습니다.

sed  's/$/\tN.A./' file1 > file-a

따라서 새 입력 파일은 다음과 같습니다.

$ cat file-a
Tumor_ID, Chromosome, start, end,       N.A.
xxxxx,       2,        12,    13,       N.A.
xxxxx,       3,        45,    46,       N.A.
xxxxx,       3,        48,    49        N.A.
xxxxx,       3,        51,    52,       N.A.
nnnnn,       5,       55,    59,        N.A.
nnnnn,       5,       57,    58,        N.A.
lllll,      11,       13,    14,        N.A.
lllll,      12,        16,    17,       N.A.
eeeee,       2,        51,    52,       N.A.
zzzzz,       9,      1000,   101,       N.A.

$ cat file-b
Patient_No.,Tumor_ID,Normal_ID,
4,xxxxx,hhhhh,
5,nnnnn,aaaaa,
8,lllll,ddddd,
7,eeeee,ggggg,
3,zzzzz,nnnnn,

목표를 달성하기 위한 명령은 다음과 같습니다.

$ while IFS="," read a b c;do sed -i "/${b}/{s/N.A./${c}/}" file-a;done <file-b

$ cat file-a
Tumor_ID, Chromosome, start, end,       Normal_ID
xxxxx,       2,        12,    13,       hhhhh
xxxxx,       3,        45,    46,       hhhhh
xxxxx,       3,        48,    49        hhhhh
xxxxx,       3,        51,    52,       hhhhh
nnnnn,       5,       55,    59,        aaaaa
nnnnn,       5,       57,    58,        aaaaa
lllll,      11,       13,    14,        ddddd
lllll,      12,        16,    17,       ddddd
eeeee,       2,        51,    52,       ggggg
zzzzz,       9,      1000,   101,       nnnnn

자신에게 적합한 형식을 사용하여 출력을 아름답게 만들 수 있습니다.

답변2

필드의 공백과 후행 쉼표가 질문의 오타라고 가정합니다. 그렇다면실제로부분 데이터를 사용한 다음 다음을 사용하여 정리합니다.

mlr -I --csv -N clean-whitespace then remove-empty-columns file1.csv file2.csv

위 명령은 다음을 사용합니다.밀러( mlr)는 각 필드 값에서 선행 및 후행 공백을 제거하고 여러 공백을 단일 공백으로 압축한 다음 비어 있게 되는 열을 제거합니다. 이 작업은 "그 자리에서" 수행되어 원본 파일을 덮어씁니다. -I원본 파일을 유지하려면 이 옵션을 제거하고 새 파일 이름으로 리디렉션하세요.

이렇게 하면 두 개의 파일이 생성됩니다 file1.csv.

Tumor_ID,Chromosome,start,end
xxxxx,2,12,13
xxxxx,3,45,46
xxxxx,3,48,49
xxxxx,3,51,52
nnnnn,5,55,59
nnnnn,5,57,58
lllll,11,13,14
lllll,12,16,17
eeeee,2,51,52
zzzzz,9,1000,101

... 그리고 file2.csv,

Patient_No.,Tumor_ID,Normal_ID
4,xxxxx,hhhhh
5,nnnnn,aaaaa
8,lllll,ddddd
7,eeeee,ggggg
3,zzzzz,nnnnn

Tumor_ID그런 다음 해당 필드를 조인 키로 사용하여 이들 간의 관계형 조인 작업을 수행할 수 있습니다.

$ mlr --csv join -f file1.csv -j Tumor_ID file2.csv
Tumor_ID,Chromosome,start,end,Patient_No.,Normal_ID
xxxxx,2,12,13,4,hhhhh
xxxxx,3,45,46,4,hhhhh
xxxxx,3,48,49,4,hhhhh
xxxxx,3,51,52,4,hhhhh
nnnnn,5,55,59,5,aaaaa
nnnnn,5,57,58,5,aaaaa
lllll,11,13,14,8,ddddd
lllll,12,16,17,8,ddddd
eeeee,2,51,52,7,ggggg
zzzzz,9,1000,101,3,nnnnn

불필요한 Patient_No.필드 제거는 추가 작업을 통해 수행됩니다 ( cut하위 명령 -x의 옵션은 cut"이름이 지정된 필드 제거"를 의미함 -f).

$ mlr --csv join -f file1.csv -j Tumor_ID then cut -x -f Patient_No. file2.csv
Tumor_ID,Chromosome,start,end,Normal_ID
xxxxx,3,45,46,hhhhh
xxxxx,3,48,49,hhhhh
xxxxx,3,51,52,hhhhh
nnnnn,5,55,59,aaaaa
nnnnn,5,57,58,aaaaa
lllll,11,13,14,ddddd
lllll,12,16,17,ddddd
eeeee,2,51,52,ggggg
zzzzz,9,1000,101,nnnnn

필요하지 않은 필드를 제거하고 싶지 않을 수도 있지만, 유지하려는 필드와 순서를 정확히 말할 수 있습니다. 이는 두 번째 파일에 다른 필드가 많이 있고 거기에서 해당 필드를 사용하려는 경우 Normal_ID특히 편리합니다 . 아래 하위 명령 -o의 옵션은 cut언급된 필드를 추출해야 할 -f뿐만 아니라 언급된 순서대로 정렬해야 함을 나타냅니다.

mlr --csv join -f file1.csv -j Tumor_ID then cut -o -f Tumor_ID,Chromosome,start,end,Normal_ID file2.csv

관련 정보