AWK нужно прочитать один файл и искать в другом - PullRequest
0 голосов
/ 26 февраля 2019

Мне нужно прочитать файл и сохранить столбцы 1 и 4, найти второй файл, используя первый столбец и сохранить столбец 4 второго файла, а затем выполнить вычитание между столбцом 04 файла 01 и столбцом 04 файла 2,Вы можете мне помочь?Столбец 04 указывается в секундах.

Два файла содержат следующие заголовки.

ID, origin, destination, time

Мне нужно получить первый идентификатор в файле 1 и посмотреть в файле 2.

Например, возьмите ID 37 из файла 1 и посмотрите на файл 2. Когда я нахожу его, мне нужно, чтобы время ID 37 в первом файле было вычтено из времени ID 37 в файле 2

Iнужна сумма времени вычитания.

Интересно, если awk верное решение

Файл 01

37 33 44 602.04
39 32 13 602.20

Файл 02

37 44 44 602.184852493
39 13 13 602.263704529

Вывод

0,2

Ответы [ 2 ]

0 голосов
/ 26 февраля 2019

Одной из возможностей для рассмотрения является разделение задачи на две части - объединение двух файлов на основе этого общего поля, а затем выполнение математических операций.Это избавляет от необходимости хранить часть каждой строки из одного файла в памяти все сразу, что хорошо, если они большие.

В следующем предполагается, что а) файлы отсортированы по первому столбцу, b) что вкладки используются для разделения столбцов:

$ join -j1 -o '1.4 2.4' file1.txt file2.txt | awk '{total+=$2-$1} END {print total}'
0.208557

Команда объединения объединяет два файла в общих строках и выводит только те числа, которые вы хотите вычесть, которые передаются в awk для выполнения фактической математики..

Редактировать: Или все в awk:

$ awk 'NR==FNR { f1[$1]=$4; next }
       $1 in f1 { total += $4 - f1[$1] }
       END { print total }' file1.txt file2.txt
0.208557

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

0 голосов
/ 26 февраля 2019

f1.col4 - f2.col4:

awk 'NR==FNR{a[$1]=$4;next}{$4=a[$1]?a[$1]-$4:$4}7' f1 f2 

Вывод выглядит так:

37 44 44 -0.144852
39 13 13 -0.0637045
41 44 44 -0.0642587
44 13 13 -0.0196296
45 44 44 -0.0145357
47 13 13 -0.014259

Если вы хотите f2.col4 - f1.col4, используйте $4-a[$1]в приведенном выше коде вы получите:

37 44 44 0.144852
39 13 13 0.0637045
41 44 44 0.0642587
44 13 13 0.0196296
45 44 44 0.0145357
47 13 13 0.0142594
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...