Объединение CSV-файлов на основе идентификатора, даже если несоответствующие IDS и неопределенное количество столбцов

Вы можете указать awk, какое преобразование с плавающей запятой -использовать, установив CONVFMT, по умолчанию %.6g, например.:

cat sample | awk -v CONVFMT='%.1f' '
/HDD Total/ { hdd_total = $NF }
/HDD Used/  { hdd_used  = $NF }
END {
  used=hdd_total-hdd_used
  print "cal = " used
}'

Выход:

cal = 40.9
0
18.10.2019, 11:42
2 ответа

Вы можете использовать сценарий оболочки для создания необходимых -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
28.01.2020, 02:17

Используя Миллера (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
2
28.01.2020, 02:17

Теги

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