Решение оболочки будет медленным для большого набора данных / файлов, но вот оно.
data1.csv и его содержимое
ID,DATE,AMOUNT
1,2019-09-08 00:00:00,3000
1,2019-10-08 00:00:00,1500
1,2019-11-20 00:00:00,1560
2,2008-05-20 00:00:00,2060
data2.csv и его содержимое
ID,NAME,AGE,Location
1,J. Smith,32,New York
2,A. Jones,25,Chicago
Скрипт.
#!/usr/bin/env bash
IFS= read -r data1_head < data1.csv
IFS= read -r data2_head < data2.csv
printf '%s,%s\n' "$data1_head" "${data2_head#*,}"
while IFS= read -ru8 data1; do
while IFS= read -ru9 data2; do
if [[ "${data1%%,*}" == "${data2%%,*}" ]]; then
printf '%s,%s\n' "$data1" "${data2#*,}"
fi
done 9< <(tail -n+2 data2.csv)
done 8< <(tail -n+2 data1.csv)
Выход
ID,DATE,AMOUNT,NAME,AGE,Location
1,2019-09-08 00:00:00,3000,J. Smith,32,New York
1,2019-10-08 00:00:00,1500,J. Smith,32,New York
1,2019-11-20 00:00:00,1560,J. Smith,32,New York
2,2008-05-20 00:00:00,2060,A. Jones,25,Chicago
Если ed
доступен / приемлем, предполагается, что оба файла CSV находятся в том же каталоге, что и сценарий.
#!/bin/sh
ed -s data1.csv <<-'EOF'
1r data2.csv
2s/^ID//
1,2j
g/^1,[[:digit:]]/ /^1,[[:alpha:]]/t.
g/^2,[[:digit:]]/ /^2,[[:alpha:]]/t.
2,3d
g/^[[:digit:]]/+1s/^[[:digit:]]//
g/^[[:digit:]]/;/^,.*/j
,p
Q
EOF