Используя сценарий оболочки, мне нужно объединить данные из двух файлов в один файл

Модуль ZFS не сообщается в буферах+кэшированном

я обновляю свой инструмент анализатора памяти, который помогает находить подобные проблемы

память без ошибок

0
07.06.2017, 11:01
3 ответа

Вы можете использовать Awk скрипт для этого. Проанализируйте оба файла, пропуская заголовки, создайте хэш-карту содержимого file2 и file1, если присутствует значение столбца 1 из другого файла, напечатайте его значение (иначе) напечатайте пользовательскую строку 00, как вы показали.

#!/usr/bin/env awk

BEGIN {
    printf "hour value1 value2\n"
}

NR>1 && FNR==NR {
    hash[$1]=$2; next
}

FNR>1 {
    if ($1 in hash) {
        printf "%s\t%s\t%s\n",$1,$2,hash[$1]
    } else {
        printf "%s\t%s\t%s\n",$1,$2,"00"
    }
}

Запустите этот скрипт как

awk -f script.awk file2 file1
hour value1 value2
01      25      03
02      24      00
03      24      05
04      27      00
05      30      03

, что должно дать вам необходимый вывод.


То же самое можно сделать и с однострочной нечитаемой версией командной строки.

awk 'BEGIN{printf "hour value1 value2\n"} NR>1 && FNR==NR{hash[$1]=$2; next} FNR>1 { if ($1 in hash) {printf "%s\t%s\t%s\n",$1,$2,hash[$1] } else {printf "%s\t%s\t%s\n",$1,$2,"00"} }' file2 file1
2
28.01.2020, 02:13

Если вы уже отсортировали (по значению поля час) входные файлы, рассмотрите возможность использования конвейера join + awk :

join --header -a1 file1 file2 | awk 'NF<3{ $0=$0 OFS "00" }1' | column -t

​​Вывод:

hour  value1  value2
01    25      03
02    24      00
03    24      05
04    27      00
05    30      03

  • -a1 - печатает непарные строки из файла 1

  • NF<3{ $0=$0 OFS "00" } - заменяет несовпадающее пустое поле на 00

2
28.01.2020, 02:13
$ join -o1.1,1.2,2.2 -a1 -e 00 file1 file2 | column -t
hour  value1  value2
01    25      03
02    24      00
03    24      05
04    27      00
05    30      03

С помощью -o1.1,1.2,2.2мы указываем, какие выходные поля этой операции реляционного соединения мы хотим видеть. Формат для этого file_number.field_number.

С помощью -a1мы говорим, что хотели бы иметь все строки из первого файла, даже если они ничему не соответствуют во втором файле.

С помощью -e 00мы говорим, что любые отсутствующие значения должны быть заменены строкой 00.

Это предполагает, что два файла отсортированы одинаково.

5
28.01.2020, 02:13

Теги

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