![열을 일치시켜 두 개의 CSV 파일을 결합하고 결합 명령](https://linux55.com/image/135880/%EC%97%B4%EC%9D%84%20%EC%9D%BC%EC%B9%98%EC%8B%9C%EC%BC%9C%20%EB%91%90%20%EA%B0%9C%EC%9D%98%20CSV%20%ED%8C%8C%EC%9D%BC%EC%9D%84%20%EA%B2%B0%ED%95%A9%ED%95%98%EA%B3%A0%20%EA%B2%B0%ED%95%A9%20%EB%AA%85%EB%A0%B9.png)
열 1을 기준으로 일치시켜야 하는 두 개의 .csv 파일이 있습니다.
두 가지 파일 구조는 다음과 같습니다.
파일 1
gopAga1_00004004-RA,1122.825534, -2.497919969, 0.411529843
gopAga1_00010932-RA,440.485381, 1.769511316, 0.312853434
gopAga1_00007012-RA, 13.37565185, -1.973108929, 0.380227982
etc...
파일 2
gopAga1_00004004-RA, ENSACAP00000013845
gopAga1_00009937-RA, ENSACAP00000000905
gopAga1_00010932-RA, ENSACAP00000003279
gopAga1_00000875-RA, ENSACAP00000000296
gopAga1_00010837-RA, ENSACAP00000011919
gopAga1_00007012-RA, ENSACAP00000012682
gopAga1_00017831-RA, ENSACAP00000016147
gopAga1_00005588-RA, ENSACAP00000011117
etc..
이것은 현재 Join을 사용하여 실행하는 명령입니다.
이것은 내가 다음 스레드에서 읽은 내용의 형식입니다.여기
join -1 1 -2 1 -t , -a 1 -e "NA" -o "2.2,1.1,1.2,1.3" <(sort -k 1 healthy_vs_unhealthy_de.csv) <(sort RBH.csv) > output.txt
그러나 이 프롬프트를 실행할 때마다 출력의 첫 번째 줄만 기록됩니다.
내 코드가 이렇게 작동하고 실제로 GOP ID를 기반으로 두 파일을 병합하지 않는 이유를 아는 사람이 있습니까?
답변1
구분 기호를 쉼표로 지정해야 합니다.sort
# join -1 1 -2 1 -t , -a 1 -e "NA" -o "2.2,1.1,1.2,1.3" <(sort -t',' -k 1 healthy_vs_unhealthy_de.csv) <(sort -t',' RBH.csv)
ENSACAP00000013845,gopAga1_00004004-RA,1122.825534, -2.497919969
ENSACAP00000012682,gopAga1_00007012-RA, 13.37565185, -1.973108929
ENSACAP00000003279,gopAga1_00010932-RA,440.485381, 1.769511316
답변2
~처럼시바는 정확하게 지적했다, 주요 문제는 sort
유틸리티가 잘못 호출된다는 것입니다. 그러나 공백이 삽입되어 정렬에 문제가 발생할 수도 있습니다.
사용으로 전환csvkit 도구명령줄에서 CSV 파일을 구문 분석하고 처리하기 위해 이를 사용하여 csvjoin
조인을 수행할 수 있습니다. 이는 입력 데이터에 빈 행이 없다고 가정합니다. 빈 줄이 있으면 를 통해 먼저 제거됩니다 grep -vx '[[:blank:]]*'
.
csvjoin --no-header-row --skipinitialspace --columns=1 file1 file2
또는 짧은 옵션을 사용하세요.
csvjoin -HS -c 1 file1 file2
귀하의 질문에 데이터가 주어지면 다음이 출력됩니다.
a,b,c,d,b2
gopAga1_00004004-RA,1122.825534,-2.497919969,0.411529843,ENSACAP00000013845
gopAga1_00010932-RA,440.485381,1.769511316,0.312853434,ENSACAP00000003279
gopAga1_00007012-RA,13.37565185,-1.973108929,0.380227982,ENSACAP00000012682
나중에 제거할 수 있는 헤더를 추가합니다(아마도 사용 tail -n +2
).
이를 재정렬하고 세 번째 열을 제거하려면 방금 언급한 추가된 헤더 csvcut
도 제거합니다 .tail
csvjoin -HS -c 1 file1 file2 |
csvcut -c 5,1-3 |
tail -n +2
...결과는 다음과 같습니다.
ENSACAP00000013845,gopAga1_00004004-RA,1122.825534,-2.497919969
ENSACAP00000003279,gopAga1_00010932-RA,440.485381,1.769511316
ENSACAP00000012682,gopAga1_00007012-RA,13.37565185,-1.973108929
사용되는 열은 또는 유사한 조합 csvcut
과 같은 임시 헤더를 사용하여 지정할 수도 있습니다 .-c b2,a,b,c
-c b2,1-3