объединить два файла csv на основе условия

Для меня было важно пропустить двоичные файлы и скрытые файлы:

Этот вариант хорошо сработал для меня:

find . -type f -not -path '*/\.*' -exec grep -Il '.' {} \; | xargs -d '\n' -L 1 dos2unix -k

Что переводится как: рекурсивно найти все нескрытые файлы в текущем каталоге, затем с помощью grep вывести список всех не -binary (-I) непустые файлы, затем передать их в xargs (разделенные символами новой строки) по одному файлу за раз в dos2unix и сохранить исходную метку времени.

См. также:

https://github.com/mdolidon/endlines

0
06.02.2017, 14:46
4 ответа

Быстрого решения вашей проблемы нет, поскольку входные файлы не отсортированы. Однако вы можете сделать что-то вроде этого:

join -o 0,1.2,1.3,2.3 <(sort A.csv) <(sort B.csv)
3
28.01.2020, 02:25

Хотя вопрос неточно определяет, какие поля должны использоваться для объединения - похоже, что это поле1 и поле2 (с опечаткой в A.csv field2=20.875 вместо 20.857).

Если вам нужно присоединиться только к первому полю, то решение Майклса подходит.
Если вам нужно объединить два первых поля, вы можете использовать:

join <(sed -e 's/  */:/' a.csv | sort) <(sed -e 's/  */:/' b.csv | sort)

(возможно, вам придется подправить sed regex, если поля разделены не только пробелами). Решение Ракеша довольно неэффективно, поскольку оно сканирует оба A.csv и B.csv для каждой строки в A.csv.

0
28.01.2020, 02:25

Попробуйте этот:

for i in `awk '{print $1}' A.csv`;
 do
         t1=`awk -v a="$i" '$1==a {print $3}' A.csv`;
         awk -F' ' -v a="$i" -v b="$t1" '$1==a {print $1" "$2" "$3" " b }' B.csv;
 done
0
28.01.2020, 02:25

С таким количеством данных вам следует рассмотреть возможность импорта данных в базу данных, создания индексов по (широта, долгота), а затем вы сможете получить результаты с помощью

select a.latitude, a.longitude, a.value, b.value
from a, b
where a.latitude  = b.latitude
  and a.longitude = b.longitude;
0
28.01.2020, 02:25

Теги

Похожие вопросы