Я использовал awk
, который обрабатывает несколько файлов одновременно:
sed 's/,R[1-9]\+\.csv:/,/g' <(awk -v HEADER="$(printf ",%s:" R{1..3}.csv)" -F, '
{ seen[$1]=seen[$1]","FILENAME":"$2; }
END { print HEADER; for (x in seen) print x seen[x]}' R{1..3}.csv \
|awk -F, 'NR==1{split($0,arr,/,/);next} {SEP=""; fld=1;
for (x in arr){printf ($0 ~ arr[x])?SEP""$(fld++):",0";SEP=","};print ""}')
Выход:
A,1,0,1
B,20,0,4
C,30,1,0
D,0,13,0
E,0,15,2
F,0,19,0
G,0,0,6
H,0,0,8
Разрыв кода -вниз:
awk -F, '{ seen[$1]=seen[$1]","FILENAME":"$2; }
END{ print HEADER; for (x in seen) print x seen[x] }' R{1..3}.csv
Основная часть кода, объединяющая все вторые столбцы во всех файлах в один, печатает значение, принадлежащее файлу, имеющему такой же первый столбец. Здесь seen
— это имя массива с ключом в качестве первого столбца и значением с ,FILENAME:$2
в режиме добавления.
В seen[$1]=seen[$1]","FILENAME":"$2;
означает печать запятой ,
, за которой следует текущий файл обработки FILENAME
с awk , двоеточие :
, за которым следует значение второго столбца $2
, если он имеет тот же первый столбец seen[$1]=...
и добавьте в тот же ключевой индекс =seen[$1]...
и сохраните в том же значении ключа.
Оператор END
, awk , выполняющий этот блок в конце, когда все записи/строки прочитаны, и мы использовали цикл for -для перебора массива , видимого и Сначала напечатайте ключ , а затем значение ключа .
Будет результатом:
A,R1.csv:1,R3.csv:1
B,R1.csv:20,R3.csv:4
C,R1.csv:30,R2.csv:1
D,R2.csv:13
E,R2.csv:15,R3.csv:2
F,R2.csv:19
G,R3.csv:6
H,R3.csv:8
Хорошо, теперь мы знаем, что исходящие значения взяты из файлов, а в каких файлах этих данных нет. Для этого, чтобы заполнить данные не -существующих файлов с помощью 0
, я использовал подстановку команд оболочкидля создания строки заголовка, объединяющей все имена файлов , и передал в awk какHEADER
-v переменная:
awk -v HEADER="$(printf ",%s:" R{1..3}.csv)"...
позже мы воспользуемся этой строкой HEADER
и заполним данные пропущенных файлов строкой 0
. Теперь наш ввод имеет такой формат:
$ awk -v HEADER="$(printf ",%s:" R{1..3}.csv)" -F, '
{ seen[$1]=seen[$1]","FILENAME":"$2; }
END { print HEADER; for (x in seen) print x seen[x]}' R{1..3}.csv
,R1.csv:,R2.csv:,R3.csv:
A,R1.csv:1,R3.csv:1
B,R1.csv:20,R3.csv:4
C,R1.csv:30,R2.csv:1
D,R2.csv:13
E,R2.csv:15,R3.csv:2
F,R2.csv:19
G,R3.csv:6
H,R3.csv:8
Затем я использовал другой приведенный ниже awk скрипт, чтобы заполнить данные не -исходящих файлов 0
, которые я скопировал из моего другого ответа на вопрос «Форматирование и заполнение пропущенных данных на основе колонны» .
... |awk -F, 'NR==1{split($0,arr,/,/);next} {SEP=""; fld=1;
for (x in arr){printf ($0 ~ arr[x])?SEP""$(fld++):",0";SEP=","};print ""}'
В конце концов, sed 's/,R[1-9]\+\.csv:/,/g'
используется для замены существующего имени файла в результате одной запятой ,
.
Репозиторий main
отсутствует в вашем sources.list (отсутствуют зависимости, доступные в репозитории main
).
Отредактируйте /etc/apt/sources.list
следующим образом:
deb http://deb.debian.org/debian stretch main
deb-src http://deb.debian.org/debian stretch main
deb http://deb.debian.org/debian-security/ stretch/updates main
deb-src http://deb.debian.org/debian-security/ stretch/updates main
deb http://deb.debian.org/debian stretch-updates main
deb-src http://deb.debian.org/debian stretch-updates main
deb https://dl.winehq.org/wine-builds/debian/ stretch main
Отключить все репозитории под/etc/apt/sources.list.d/
Затем запустите:
sudo apt update
sudo apt upgrade
sudo apt dist-upgrade
sudo apt install --install-recommends winehq-stable
apt policy libjbig0:i386
apt policy libjbig0:amd64
sudo apt install wine