Linux скрипт для транспонирования строк в столбцы - PullRequest
0 голосов
/ 01 октября 2018

У меня есть ниже набор данных и нужно несколько транспонировать.Я борюсь со сценарием.Любая помощь будет оценена.Все столбцы / значения являются динамическими

Формат файла:

ID    FieldName          FieldValue

1   Rooms Required?        Yes

1   Country of Meeting     US

2   Rooms Required? 

2   Country of Meeting  

3   Rooms Required? Yes

3   Country of Meeting  US

4   Rooms Required? No

4   Country of Meeting  BL


Требуемый вывод:

ID  Rooms Required? Country of Meeting

1     Yes                   US

2       

3     Yes                   US

4     No                     BL

Пожалуйста, помогите

Ответы [ 2 ]

0 голосов
/ 02 октября 2018

Чистое awk решение, основанное на ваших полях, разделенных символом табуляции '\t', выглядит следующим образом:

awk 'BEGIN { FS = "\t"; PROCINFO["sorted_in"] = "@ind_num_asc" } { if ( $1 !~ /^[0-9]+$/ ) next; A[$1][$2] = $3; H[$2] } END { printf "ID"; for (h in H) printf "\t" h; for (i in A) { printf "\n\n" i; for (j in A[i]) printf "\t" A[i][j] } print "\n" }' filename

И в разбивке:

awk 'BEGIN {
    FS = "\t"  #Set Field Separator as the Tab
    PROCINFO["sorted_in"] = "@ind_num_asc"  #Set array order as numbers
}
{
    if ( $1 !~ /^[0-9]+$/ )  #Skip all rows without numeric ID
        next
    A[$1][$2] = $3  #Store value in multi-dimensional array
    H[$2]           #Store header name
}
END {
    printf "ID"
    for (h in H)    #Print all headers found
        printf "\t" h
    for (i in A) {  #Print each record with corresponding values
        printf "\n\n" i
        for (j in A[i])
            printf "\t" A[i][j]
    }
    print "\n"
}' filename

Дайте мне знатьесли какие-либо дальнейшие объяснения необходимы.Это будет работать с таким количеством полей, как вы установили и в любом порядке.Если записи не имеют одинаковых полей, ваш вывод может выглядеть неровно.

0 голосов
/ 02 октября 2018

Вот общая идея с использованием joinbash для оболочки):

$ echo ID Rooms Country; \
  join -j1 -o '0 1.4 2.5' -a1 -a2 -e- <(grep -F Rooms data.txt) <(grep -F Country data.txt)

ID Rooms Country
1 Yes US
2 - -
3 Yes US
4 No BL

Адаптируйте его под свои нужды.

...