일치하는 열 정보를 기반으로 두 개의 CSV 파일의 데이터를 결합하고 싶습니다. 일치시킬 데이터는 File1.csv 열 5와 File2 열 1에서 나옵니다. 일치할 때 File2 열 2의 정보를 추가하고 일치하지 않으면 빈 큰따옴표를 남겨두고 싶습니다.
파일 1.csv
"Z","P","W","K","1","1.18.24.59"
"S","K","D","X","9","1.14.19.238"
"R","M","P","Y","8","1.15.11.21"
"B","D","0","U","5","1.9.20.159"
"R","E","W","Q","6","135.0.0.1"
"K","D","K","R","9","1.9.74.13"
파일 2.csv
"65.9.7.19","374 22 53"
"1.9.74.13","123 256 51"
"1.18.24.59","23 25 41"
"1.15.11.21","98 77 8291"
"1.14.19.238","8827 145 8291"
"1.9.20.159","283 1 5734"
원하는 출력
"Z","P","W","K","1","1.18.24.59","23 25 41"
"S","K","D","X","9","1.14.19.238","8827 145 8291"
"R","M","P","Y","8","1.15.11.21","98 77 8291"
"B","D","0","U","5","1.9.20.159","283 1 5734"
"R","E","W","Q","6","135.0.0.1",""
"K","D","K","R","9","1.9.74.13","123 256 51"
답변1
다음은 awk
.
$ awk -F, 'NR==FNR{a[$1]=$2}NR!=FNR{print $0","(a[$6]?a[$6]:"\"\"")}' file2.csv file1.csv
"Z","P","W","K","1","1.18.24.59","23 25 41"
"S","K","D","X","9","1.14.19.238","8827 145 8291"
"R","M","P","Y","8","1.15.11.21","98 77 8291"
"B","D","0","U","5","1.9.20.159","283 1 5734"
"R","E","W","Q","6","135.0.0.1",""
"K","D","K","R","9","1.9.74.13","123 256 51"
$
- file2의 행을 일치
NR==FNR{a[$1]=$2
시켜 배열에 추가하고 field #1을 입력합니다. - 그런 다음
NR!=FNR
file1의 행을 일치시키십시오. print $0","
file1의 전체 줄을 인쇄하고 그 뒤에 쉼표를 붙입니다.(a[$6]?a[$6]:"\"\"")
이전에 구성된 배열의 해당 내용을 인쇄합니다. 단,""
항목이 없는 경우에만 인쇄됩니다.
답변2
csvkit
이는 예상보다 어려웠지만 버전 1.0.2의 Python 기반 도구를 사용했습니다.
$ csvjoin -HI -c 6,1 --left File1.csv File2.csv 2>/dev/null | csvformat -K1 -U1
"Z","P","W","K","1","1.18.24.59","23 25 41"
"S","K","D","X","9","1.14.19.238","8827 145 8291"
"R","M","P","Y","8","1.15.11.21","98 77 8291"
"B","D","0","U","5","1.9.20.159","283 1 5734"
"R","E","W","Q","6","135.0.0.1",""
"K","D","K","R","9","1.9.74.13","123 256 51"
( 적어도 내 로케일에서는 점으로 구분된 필드가 날짜/시간이라고 추측하는 것을 -I
방지하기 위해 필요한 것 같습니다 .)csvjoin
답변3
for i in `cat file2.csv | awk -F "," '{print $1}'| sed 's/"//g'`; do j=`sed -n '/'$i'/p' file2.csv| awk -F "," '{print $2}'| sed 's/"//g'`;awk -v i="$i" -v j="$j" -F "," '$NF==i{$7=j;print $0}' file1.csv; done| sed 's/ /","/g'| sed 's/^/"/g'| sed 's/$/"/g'
산출
"Z","P","W","K","1","1.18.24.59","23 25 41"
"S","K","D","X","9","1.14.19.238","8827 145 8291"
"R","M","P","Y","8","1.15.11.21","98 77 8291"
"B","D","0","U","5","1.9.20.159","283 1 5734"
"R","E","W","Q","6","135.0.0.1",""
"K","D","K","R","9","1.9.74.13","123 256 51"