Это похоже на ошибку; цикл, который обрабатывает строки в этом контексте, не имеет допустимого условия выхода:
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;
Многие инструменты могут сделать это, вероятно, 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
Еще пара вариантов:
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