Как транспонировать несколько текстовых файлов?

Чтобы выполнить обновление до FreeBSD 11.1, запустите от имени пользователя root:

freebsd-update upgrade -r 11.1-RELEASE

или

freebsd-update upgrade -r 11.1

Затем система может показать несколько сообщений об установленном программном обеспечении и запросить

Does this look reasonable (y/n)? 

На что вы обычно отвечаете y.

Процедура получения «метаданных» и применения необходимых исправлений.

В конце по показанной инструкции запускаете вручную, опять же как root:

/usr/sbin/freebsd-update install

, а затем обычно отображается сообщение:

Installing updates...
Kernel updates have been installed.  Please reboot and run
"/usr/sbin/freebsd-update install" again to finish installing updates.

Затем вы перезагружаетесь, и как только система загрузится, вы входите в систему и снова работаете как пользователь root:

#/usr/sbin/freebsd-update install
src component not installed, skipped
Installing updates... done.

Наконец, чтобы проверить успешность операции:

$uname -r
11.1-RELEASE

После завершения установки вы можете запустить:

pkg update
pkg upgrade

Для установки последних обновлений безопасности.

1
25.07.2019, 06:35
2 ответа

В вашей задаче много неуказанных параметров, но в качестве отправной точки рассмотрим этот bashскрипт:

header=

for f in *.CEL
do
    if [ -z "$header" ]
    then
        l=${#f}                 # length of filename...
        fmt="%-${l}s"           #... determines width of first column

        header="$(printf "$fmt" "")"    # first column of first row is blank

        for col in $(awk '{print $1}' $f)
        do
            l=${#col}               # width of column
            [ $l -lt 8 ] && l=8     # min width of 8
            header="$header $(printf "%-${l}s" "$col")"     # append column label to header
            fmt="$fmt %-$l.6f"
        done
        printf '%s\n' "$header"         # header is first row of output
    fi

    printf "$fmt\n" "$f" $(awk '{print $2}' $f)     # print filename and all column 2 values
done

Запуск скрипта дает:

                                     FQC-10090295 FQC-10119363 FQC-10132112
RIBBY_g_5ZCV995_BI_SNP_D04_38774.CEL 0.007813     0.023438     0.093750    

Я скопировал ваш входной файл во второе имя файла и повторно -запустил:

                                     FQC-10090295 FQC-10119363 FQC-10132112
RIBBY_g_5ZCV995_BI_SNP_D04_38774.CEL 0.007813     0.023438     0.093750    
RIBBY_g_5ZCV995_BI_SNP_D04_38775.CEL 0.007813     0.023438     0.093750    

Этот сценарий сначала работает по всем *.CELфайлам.

Для первого файла сценарий строит строку заголовка header, исходя из предположения, что все имена файлов будут иметь одинаковую длину. Пока при построении строки заголовка сценарий также создает строку формата printffmt, которая будет использоваться для отображения столбцовых данных. Первое поле в строке формата — это строка достаточной длины для отображения имени файла.

Затем сценарий перебирает все значения «столбца 1» в первом входном файле, которые являются метками значений. Для каждого столбца скрипт снова берет длину метки значения (, но не менее 8 ), и добавляет эту метку в заголовок. Он также добавляет спецификацию формата с плавающей запятой -в строку fmt.

После того, как сценарий перебрал все метки столбцов, он выводит построенную строку заголовка.

Все вышеперечисленные действия выполняются только для первого файла.

Заключительный шаг в обработке первого файла и единственный шаг в обработке всех файлов после первого состоит в использовании printfдля отображения имени файла и значений «столбца 2» с использованием строка fmt, созданная во время первой итерации цикла. Затем сценарий продолжает обработку следующего файла *.CEL, если таковой имеется.

Этот подход предполагает, что метки столбцов во всех файлах одинаковы и все *.CELимена файлов имеют одинаковую длину.

0
28.01.2020, 00:05

Что-то вроде этого — то, что вам нужно:

$ cat tst.awk
BEGIN { OFS="\t" }
FNR==1 {
    row = $1
    rows[row]
    next
}
{
    col = $1
    cols[col]
    vals[row,col] = $2
}
END {
    printf "%s", ""
    for (col in cols) {
        printf "%s%s", OFS, col
    }
    print ""
    for (row in rows) {
        printf "%s", row
        for (col in cols) {
            printf "%s%s", OFS, vals[row,col]
        }
        print ""
    }
}

но без ввода/вывода, который проясняет ваши требования, и мы можем протестировать против (см. мой комментарий ), это просто непроверенное предположение.

0
28.01.2020, 00:05

Теги

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