Как объединить разные колонки в одном файле?

Это похоже на ошибку; цикл, который обрабатывает строки в этом контексте, не имеет допустимого условия выхода:

        while (1) {
                if (!jp)
                        goto err;
                if (match(jp->ps[0].cmd, p)) {
                        if (found)
                                goto err;
                        found = jp;
                        err_msg = "%s: ambiguous";
                }
                jp = jp->prev_job;
        }

Если задание соответствует строке, устанавливается found, и err_msg предварительно загружается; затем он снова проходит цикл, после установки jp на предыдущее задание. Когда он достигает конца, первое условие совпадает, поэтому управление переходит к err, который печатает ошибку:

err:
        sh_error(err_msg, name);

Полагаю, где-то здесь должен быть goto gotit...

Следующий патч исправляет это (я отправил его сопровождающему):

diff --git a/src/jobs.c b/src/jobs.c
index c2c2332..37f3b41 100644
--- a/src/jobs.c
+++ b/src/jobs.c
@@ -715,8 +715,14 @@ check:

        found = 0;
        while (1) {
-               if (!jp)
-                       goto err;
+               if (!jp) {
+                       if (found) {
+                               jp = found;
+                               goto gotit;
+                       } else {
+                               goto err;
+                       }
+               }
                if (match(jp->ps[0].cmd, p)) {
                        if (found)
                                goto err;

1
11.09.2018, 20:07
2 ответа

Многие инструменты могут сделать это, вероятно, awkпервое, что приходит на ум, но я рекомендую команду join, особенно если ввод уже отсортирован (, как в вашем примере):

join file1 <(join file2 file3) | column -t

column -tпросто для красивого выравнивания вывода, вы можете удалить его.

Выход:

DATE      PGTO_CRED  PGTO_TOTAL  PGTO_FEE
20180801  50.00      150.00      35.00
20180802  150.00     300.00      10.00
20180803  130.00     200.00      25.00
20180804  110.00     250.00      140.00
20180805  200.00     400.00      135.00
5
28.04.2021, 23:42

Еще пара вариантов:

paste file{1,2,3} | awk '{print $1,$2,$4,$6}' | column -t

или просто awk:

awk '
    NR == FNR {line[FNR] = $0; next} 
              {line[FNR] = line[FNR] OFS $2} 
    END       {for (i=1; i<=FNR; i++) print line[i]}
' file{1,2,3} | column -t
2
28.04.2021, 23:42

Теги

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