Как создать отдельные переменные в CSV-файле, полученном из значений в текстовых файлах? - PullRequest
1 голос
/ 01 мая 2019

Буду признателен за любые советы, которые вы можете дать о том, как выполнить следующее в командной строке UNIX. По сути, у меня есть текстовые файлы для каждого из моих предметов, которые выглядят следующим образом (смоделированные данные).

2.97    3.61    -1.88
-0.38   2.33    -0.22
0.76    -0.71   -0.97

Идентификатор субъекта содержится в заголовке текстового файла (например, «100012_var.txt»)

Я хотел бы написать файл .csv, в котором каждое значение (для каждого субъекта) в строке отображается под заголовком новой переменной. Например:

ID      Var1   Var2     Var3      Var4    Var5    Var6    Var7    Var8    Var9
100012  2.97    3.61    -1.88   -0.38   2.33    -0.22   0.76    -0.71   -0.97
100013  -1.21   1.79    -0.88   -0.91   2.01    2.88    0.32    -1.15   2.70

Я также хотел бы убедиться, что это согласованно для всех субъектов, т. Е. Значение 1 в строке 1 всегда кодируется VAR 1.

Буду очень признателен за любые предложения!

Ответы [ 2 ]

1 голос
/ 01 мая 2019

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

$ awk -v RS="" -v OFS="\t" '              # using whole file as a record *
NR==1 {                                   # first record, build the header
    printf "ID" OFS
    for(i=1;i<=NF;i++)
        printf "Var%d%s",i,(i<NF?OFS:ORS)
}
{
    split(FILENAME,f,"_")                 # split filename by _ to get the number
    $1=$1                                 # rebuild the record to use tabs (OFS)
    print f[1],$0                         # print number part and the values
}' 100012_var.txt 100013_var.txt          # them files

Выход:

ID      Var1    Var2    Var3    Var4    Var5    Var6    Var7    Var8    Var9
100012  2.97    3.61    -1.88   -0.38   2.33    -0.22   0.76    -0.71   -0.97
100013  -1.21   1.79    -0.88   -0.91   2.01    2.88    0.32    -1.15   2.70

* -v RS="" объяснил здесь .

0 голосов
/ 01 мая 2019

Использование Миллера (https://github.com/johnkerl/miller) и perl

mlr --n2x --ifs ' ' --repifs put '$file=FILENAME' then reorder -f file input.tsv | \
perl -p -e 's/^\r\n$//g' | \
mlr --n2c --ifs ' ' --repifs uniq -a then cut -f 2 then cat -n then reshape -s n,2 \
then rename 1,ID then rename -r '([0-9]+),VAR\1'

у вас будет (это CSV)

ID,VAR2,VAR3,VAR4,VAR5,VAR6,VAR7,VAR8,VAR9,VAR10
input.tsv,2.97,3.61,-1.88,-0.38,2.33,-0.22,0.76,-0.71,-0.97

Затем вы можете выполнить цикл for для всех файлов.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...