awk разделение всех строк по столбцам другой строкой

С помощью bsdtar вы можете указать glob:

for file in *.tar.bz2; do tar -jxf "$file" '*.txt'; done

С gnutar нужно добавить флаг --wildcards:

for file in *.tar.bz2; do tar -jxf "$file" --wildcards '*.txt'; done
0
23.04.2020, 16:39
2 ответа

К сожалению, желаемый формат вывода не совсем ясен из вашего вопроса.

Однако, как правило, если вы хотите обеспечить "отформатированный вывод таблицы -", вы можете попробовать передать результат вcolumn:

awk 'BEGIN{CONVFMT="%.5f"} FNR==NR{split($0,div);next} NR>FNR{for (i=1;i<=NF;i++) $i=$i/div[i];}1' file2.txt file1.txt | column -t

, что приведет к

1  0.83333  0.60000
7  2.33333  1.40000
1  1        1

для предоставленного вами образца ввода.

Кстати, вам не нужно использовать catпри обработке файлов сawk(или sedи т. д.)

Обновление

Из вашего редактирования я вижу, что все числа должны быть представлены в виде 5 -десятичных чисел с плавающей запятой -. В этом случае решение @guest является правильным, хотя использование columnвсе еще может быть полезно, если в любое время в будущем вы также захотите распечатать заголовки столбцов.

1
19.03.2021, 02:26

Если вы хотите, чтобы все поля были отформатированы как %.5f, вы можете использоватьsprintf:

BEGIN {
    OFS = "\t"
}

NR == 1 {
    cols = split($0,m)
    next
}

NF == cols {
    for (i=1; i<=NF; i++)
        $i = sprintf("%.5f", $i/m[i])
}

1

$ awk -f above.awk file2 file1
1.00000 0.83333 0.60000
7.00000 2.33333 1.40000
1.00000 1.00000 1.00000

Приведенная выше программа awkне предупреждает о возможных ошибках. Вы можете попробовать:

NR == 1 {
    cols = split($0,m)
    for (i in m)
        if (m[i] == 0)
            err("field "i" is "m[i]"; division by zero is fatal", 1)
    next
}

NF != cols {
    err("found "NF" fields, expected "cols)
    next
}

{
    for (i in m)
        $i = sprintf("%.5f", $i/m[i])
    print
}


END {
    exit errs
}

function err(msg, r) {

    # Print message to stderr
    # Leave non-zero exit status
    # Optionally go to END

    printf "%s - %s.\n", "error:  line "FNR" in "FILENAME, msg | "cat >&2"
    errs = 1
    if (r) exit
}

Кроме того, вы можете проверить, что каждое поле является числом.:Заставить awk выдавать ошибку -не числовым ; Могу ли я определить тип переменной awk?

2
19.03.2021, 02:26

Теги

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