Я проверил здесь другие темы о слиянии, но, похоже, они в основном касаются слияния текста, а не совсем того, что мне было нужно, или, по крайней мере, я не мог найти способ связать их решения с моей собственной проблемой.
Задача
У меня более 10 входных файлов, каждый из которых состоит из двух столбцов чисел (представьте их как x, y точек данных для графика).Цели:
- Объединить эти файлы в один файл для построения
- . Для любых повторяющихся значений x в объединении, сложить их соответствующие значения y вместе, а затем напечатать одну строку с x в поле1 и добавленные значения y в поле 2.
Рассмотрим этот пример для 3 файлов:
y1.dat
25 16
27 18
y2.dat
24 10
27 9
y3.dat
24 2
29 3
В соответствии с моими вышеуказанными целями, я должен иметь возможность объединить их в один файл с выводом:
final.dat
24 12
25 16
27 27
29 3
Попытка
Пока у меня есть следующее:
#!/bin/bash
loops=3
for i in `seq $loops`; do
if [ $i == 1 ]; then
cp -f y$i.dat final.dat
else
awk 'NR==FNR { arr[NR] = $1; p[NR] = $2; next } {
for (n in arr) {
if ($1 == arr[n]) {
print $1, p[n] + $2
n++
}
}
print $1, $2
}' final.dat y$i.dat >> final.dat
fi
done
Вывод:
25 16
27 18
24 10
27 27
27 9
24 12
24 2
29 3
При ближайшем рассмотрении ясно, что у меня есть дубликатыисходных значений x.
Проблема в том, что мой сценарий должен сначала распечатать все значения x, а затем я могу добавить их вместе для вывода.Однако я не знаю, как вернуться назад и удалить строки со старыми значениями x, которые мне понадобились для добавления.
Если я слепо использую uniq, я не знаю, старый ли x-values или новое значение x будет удалено.При использовании awk '! Duplicate [$ 1] ++' порядок удаленных строк был изменен в цикле, поэтому он правильно удаляет первый цикл, но не те, которые после этого.
Занимался этим долгоБуду признателен за любую помощь.Спасибо!