IDS가 일치하지 않고 열 개수가 가변적이라도 ID를 기준으로 CSV 파일을 병합할 수 있습니다.

IDS가 일치하지 않고 열 개수가 가변적이라도 ID를 기준으로 CSV 파일을 병합할 수 있습니다.

저는 bash 스크립트를 작성 중이며 프로세스의 일부에서는 열 무결성을 유지하면서 csv 파일을 함께 연결해야 합니다. 예를 들어 다음과 같은 형식의 두 파일이 있습니다.

F1

ID,MD,L1,L2,L3,GD,L4
12,OB,AA,PP,AA,TT,AA
15,OB,PP,PP,PP,TT,AA

F2

ID,MD,L7,L8,L9,L10,GD
13,OB,PP,AA,AA,AA,AA
15,OB,PP,PP,PP,AA,AA

출력은 다음과 같습니다. 여기서 일치하지 않는 ID 반환 값은 NM이고 중복 열(이 경우 "GD")은 각 파일의 값을 기반으로 표시됩니다.

ID,MD,L1,L2,L3,GD,L4,L7,L8,L9,L10,GD
12,OB,AA,PP,AA,TT,AA,NM,NM,NM,NM,NM
13,NM,NM,NM,NM,NM,NM,PP,AA,AA,AA,AA
15,OB,PP,PP,PP,TT,AA,PP,PP,PP,AA,AA

나는 join그것이 유망해 보이기 때문에 그 일을 해왔 습니다.join -t, -eNM -a1 -a2 -o 0,1.2,1.3,1.4,1.5,1.6,1.7,1.8,2.3,... F1 F2

하지만 몇 가지 문제가 발생했습니다.

  1. 이 옵션을 사용하면 -o각 파일에 대해 독립적으로 달라지는 정확한 열 수를 알고 있다고 가정합니다.

  2. 결과에서 오류가 발생했습니다: join: REPORT_2|15-10-2019|15:39:25.csv:5: is not sorted: 04181646

대안이 있다면 join제안을 받아들이겠습니다. 감사해요.

답변1

쉘 스크립트를 사용하여 필요한 -o옵션을 생성하고 입력 파일의 데이터를 정렬할 수 있습니다.

이는 두 번째 필드가 MD두 입력 파일 모두에 존재하고 출력에서 ​​한 번만 인쇄된다고 가정합니다(두 번째 파일의 옵션에서는 건너뛰었습니다).

#!/bin/bash

opts="0,"

# file1: get number of columms - 1 from the first line
numcols=$(awk -F',' '(NR==1) {print NF-1}' "$1")

# file1: add options
for i in $(seq "$numcols"); do
  opts+=$(printf '1.%s,' "$((i+1))")
done

# file2: get number of columms - 2 from the first line
numcols=$(awk -F',' '(NR==1) {print NF-2}' "$2")

# file2: add options
for i in $(seq "$numcols"); do
  opts+=$(printf '2.%s,' "$((i+2))")
done

opts=${opts:0:-1} # remove the last `,`

join -t, --header -eNM -a1 -a2 -o "$opts"\
  <(head -n1 "$1"; tail -n+2 "$1" | sort -nk1,1)\
  <(head -n1 "$2"; tail -n+2 "$2" | sort -nk1,1)

--header첫 번째 행을 머리글 행으로 처리하는 옵션을 추가했습니다 . <(head -n1 "$1"; tail -n+2 "$1" | sort -nk1,1)머리글 행을 인쇄하고 첫 번째 필드를 기준으로 나머지 행을 숫자로 정렬하는 데 사용됩니다 .

스크립트를 실행 가능하게 만들기

chmod +x join.sh

다음과 같이 실행하십시오.

./join.sh file1 file2

답변2

밀러 사용(https://github.com/johnkerl/miller), 당신은 실행할 수 있습니다

mlr --csv join  -u --ul --ur -j ID -f input_01.csv  \
then unsparsify \
then put -S 'for (k in $*) { if ($[k] =~ "^$") { $[k]="NM" }}' \
input_02.csv

그리고 얻다

ID,MD,L7,L8,L9,L10,L1,L2,L3,L4
13,OB,PP,AA,AA,AA,NM,NM,NM,NM
15,OB,PP,PP,PP,AA,PP,PP,PP,AA
12,OB,NM,NM,NM,NM,AA,PP,AA,AA

관련 정보