Я хотел бы проанализировать файл TXT, но данные представляют собой массив из 1 столбца, и он должен быть в массиве из нескольких столбцов

Ответ Александра Миллса, который использует handleJobs, дал мне отличную отправную точку, но также дал мне эту ошибку

warning: run_pending_traps: bad value in trap_list[17]: 0x461010

Это может быть гонка bash -проблема с условием

Вместо этого я просто сохранял pid каждого потомка, ждал и получал код выхода для каждого потомка конкретно. Я нахожу это чище с точки зрения подпроцессов, порождающих подпроцессы в функциях, и избегания риска ожидания родительского процесса там, где я хотел дождаться дочернего. То, что происходит, понятнее, потому что ловушка не используется.

#!/usr/bin/env bash

# it seems it does not work well if using echo for function return value, and calling inside $() (is a subprocess spawned?) 
function wait_and_get_exit_codes() {
    children=("$@")
    EXIT_CODE=0
    for job in "${children[@]}"; do
       echo "PID => ${job}"
       CODE=0;
       wait ${job} || CODE=$?
       if [[ "${CODE}" != "0" ]]; then
           echo "At least one test failed with exit code => ${CODE}" ;
           EXIT_CODE=1;
       fi
   done
}

DIRN=$(dirname "$0");

commands=(
    "{ echo 'a'; exit 1; }"
    "{ echo 'b'; exit 0; }"
    "{ echo 'c'; exit 2; }"
    )

clen=`expr "${#commands[@]}" - 1` # get length of commands - 1

children_pids=()
for i in `seq 0 "$clen"`; do
    (echo "${commands[$i]}" | bash) &   # run the command via bash in subshell
    children_pids+=("$!")
    echo "$i ith command has been issued as a background job"
done
# wait; # wait for all subshells to finish - its still valid to wait for all jobs to finish, before processing any exit-codes if we wanted to
#EXIT_CODE=0;  # exit code of overall script
wait_and_get_exit_codes "${children_pids[@]}"

echo "EXIT_CODE => $EXIT_CODE"
exit "$EXIT_CODE"
# end

0
06.04.2020, 19:01
1 ответ

Я вижу 3 решения (1-е мощное, 2-е простое, 3-е быстрое):

  1. дрель apache . Он может анализировать TSV среди многих других форматов. Хотя, если это редкий случай, когда вы сталкиваетесь с такой проблемой, это может быть слишком тяжелым.

  2. используйте python или perl oneliner, чтобы просто разделить строку и повторно обработать ее, например:

$ ps ax | head
   PID TTY      STAT   TIME COMMAND
     1 ?        Ss     2:40 /sbin/init
     2 ?        S      0:08 [kthreadd]
     3 ?        S      0:00 [ksoftirqd/0]
     5 ?        S<     0:00 [kworker/0:0H]
     8 ?        S     13:32 [rcu_sched]
     9 ?        S      0:00 [rcu_bh]
    10 ?        S      0:07 [migration/0]
    11 ?        S<     0:00 [lru-add-drain]
    12 ?        S      0:18 [watchdog/0]
$ ps ax | head |perl -n -e 'sub mynormalize($){ $r = shift;$r->[4]=substr($r->[4], 0, 2); return $r}; my @row = split; print(join("\t", @{ normalize(\@row) }), "\n"); '
PID     TTY     STAT    TIME    CO
1       ?       Ss      2:40    /s
2       ?       S       0:08    [k
3       ?       S       0:00    [k
5       ?       S<      0:00    [k
8       ?       S       13:32   [r
9       ?       S       0:00    [r
10      ?       S       0:07    [m
11      ?       S<      0:00    [l
12      ?       S       0:18    [w
  1. используйте vim+regex или sed. То же, что и в #2, но для более простых преобразований.
0
19.03.2021, 02:32

Теги

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