Объединение нескольких CSV-файлов с одинаковым заголовком в несколько групповых файлов

Предположим, что у вас есть файл с именем file, который содержит строки с взаимно разными числами, разделенными пробелом -, и у вас есть набор из 6 чисел -, например. 38, 39, 40, 41, 42, 43 -, которые вы хотите найти в комбинациях из трех, так что строки, которые последовательно содержат три из этих чисел в случайном порядке, перечислены в результате поиска, вы можете использовать:

grep -P  '((^|\s+)(38|39|40|41|42|43)(?=($|\s))){3}' file

который использует grep с регулярным выражением Perl (PCRE ).

0
17.03.2021, 18:37
1 ответ

Гарантируется ли, что повторяющиеся заголовки будут найдены только в последовательных файлах? С этим ответом я хотел справиться, если это не так:

#!/bin/bash

# Declare header_list[] to be an associative array
declare -A header_list

# Read the first line from every *.csv file in $1
# Each filename is added to the appropriate entry in header_list[]
for f in "${1:?}"/*.csv; do
  echo "### Reading header from $f"
  header_list[$(head -1 "$f")]+="${IFS}$f"
done

# Handle the list of files for each entry in header_list[]
group_id=1
for key in "${!header_list[@]}"; do
  value="${header_list[$key]}"
  groupfile="${2:?}/GROUP-${group_id}.csv"
  echo "### Header: ${key}"
  echo "### Group File: ${groupfile}"
  
  # Echo the header as the first line of $groupfile
  echo "${key}" > "${groupfile}"
  
  # Skip the first line, but echo every other line from each file with this header
  for file in ${value}; do
  echo "# File: ${file}"
    tail --lines=+2 "$file" >> "${groupfile}"
  done
  
  # Increment group_id
  (( group_id++ ))
done

Сохранение в файл и запуск с двумя аргументами. :Каталог, содержащий исходные файлы, и выходной каталог.

Некоторые предостережения:

  • Выходной каталог должен существовать.
  • Имена файлов с символами в $IFS не будут обрабатываться должным образом.
0
18.03.2021, 22:24

Теги

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