Без тестирования:
awk -F "\t" '
{ key = $1 FS $2 FS $3 FS $4; values[key] = values[key] FS $5 }
END { for (key in values) print key values[key] }
' file ...
Заголовок
Для каждого файла нужно извлечь часть имени файла и использовать ее в качестве заголовка. Мы будем отслеживать заголовок с помощью отдельной строки, добавляя к ней каждый файл.
awk -F "\t" '
BEGIN { header = "col1" FS "col2" FS "col3" FS "col4" }
{
key = $1 FS $2 FS $3 FS $4
values[key] = values[key] FS $5
}
FNR == 1 {
split(FILENAME, a, /_/)
header = header FS a[2]
}
END {
print header
for (key in values)
print key values[key]
}
' file ...
Мы инициализируем заголовок в блоке BEGIN. Дайте первым 4 столбцам любые заголовки, какие вам нужны.
Переменная FNR
- это номер записи текущего файла. Когда FNR == 1
, мы находимся на первой строке этого файла. Переменная awk FILENAME
содержит имя файла, который обрабатывается в данный момент.
Сортировка
Если вы используете GNU awk, то в блоке END (reference) можно сделать следующее:
END {
print header
# order the array by index, as strings, ascending
PROCINFO["sorted_in"] = "@ind_str_asc"
for (key in values)
print key values[key]
}
Если у вас нет GNU awk, то можно сделать следующее:
awk '...' | {
read header
echo "$header"
sort
}