Требуется скрипт Awk или Unix для транспонирования / поворота по следующему шаблону

При вводе swig в командной строке оболочка будет искать эту команду в каталогах, перечисленных в переменной $PATH. Он будет использовать сопоставление first, которое он найдет.

Поскольку swig, который вы установили (скорее всего), находится в $HOME/local/swig/bin и поскольку этот каталог либо отсутствует в вашем $PATH, либо слишком поздно в нем, он подхватывает старую версию команды.

Поместите $HOME/local/swig/bin в начале пути (сначала убедитесь, что это правильный каталог):

PATH="$HOME/local/swig/bin:$PATH"

См. также Как задать переменную пользовательской среды? (постоянно, а не сессионно)

Кроме того, можно запустить swig с указанным путем:

$ ~/local/swig/bin/swig

Или, если вы находитесь в домашнем каталоге:

$ local/swig/bin/swig

1
19.06.2017, 19:53
3 ответа

И решение с использованием awk:

awk -F';' '{ gsub(/ /,"");}
           NR==1 { cols = split($0, col); }
           NR > 2 { for (i = 2; i <= cols; i++) {
                        data[col[i]";"$1] = $1";"col[i]";"$i; }
                  }
           END { no = asorti(data, sorted);
                 for (i = 1; i <= no; i++) {
                     print data[sorted[i]]; }
               }' input
0
28.01.2020, 00:54

В bash это можно сделать с помощью внутренних команд tailиcut:

#! /bin/bash
# Get header line
header=$( head -n 1 data_file )
# Make a variable with all delimiters (2)
delimiters=${header//[^;]/}
# Make an array with all column names
declare -a colnames=( ${header//;/ } )
# For all columns one at the time...
for C in $(seq 2 $((${#delimiters}+1)) ) ; do
    index=$((C-1))
    # Skip first 3 lines of data_file
    tail --lines=+3 data_file | cut -d\; -f1,$C | while read; do
        # Replace first ';' with column name
        line=${REPLY/;/;${colnames[$index]};}
        # Remove all spaces and print
        echo ${line// /}
    done
done

Пояснение:

Получить первую строку файла в переменную (, которую затем можно изменить)

header=$( head -n 1 data_file )

Удалить все символы из переменной, за исключением разделителя cemi -двоеточие

delimiters=${header//[^;]/}

Теперь переменная $delimiters содержит ';;'

Заменить все ';' с пробелами. Это даст «N A B». Один или несколько пробелов являются разделителями массива:

declare -a colnames=( ${header//;/ } )

Получить количество символов в переменной:

${#delimiters}

Добавить один:

$((${#delimiters}+1))

Тогда

$(seq 2 $((${#delimiters}+1)) )

равно:

$(seq 2 3 )

Индекс в переменной идет от 0..n, затем -1 для поиска имен столбцов:

index=$((C-1))

Прочитать файл, пропустить первые 3 строки, показать только номер столбца $C,прочитать строку в переменную$REPLY:

tail --lines=+3 data_file | cut -d\; -f1,$C | while read; do
0
28.01.2020, 00:54

Вот фрагмент кода с использованием Python...

Код:

# read in the data
with open('data_file', 'rU') as f:
    # read in the header
    header = [x.strip() for x in f.readline().split(';')]

    # drop the ======
    dump_marker = f.readline()

    # get the rest of the data
    data = [[x.strip() for x in line.split(';')] for line in f.readlines()]

# print the data in new format
for i, col in enumerate(header[1:]):
    for line in data:
        print("{};{};{}".format(line[0], col, line[i+1]))

данные _файл:

N ; A ; B
=========
1 ; 01;02
2 ; 02;02

Результат:

1;A;01
2;A;02
1;B;02
2;B;02
0
28.01.2020, 00:54

Теги

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