如何在从文本文件中的值派生的.csv文件中创建单独的变量?

如何在从文本文件中的值派生的.csv文件中创建单独的变量?,csv,unix,awk,text-files,Csv,Unix,Awk,Text Files,如果您能就如何在UNIX命令行中运行以下命令提供任何建议,我将不胜感激。基本上,我的每个主题都有文本文件,如下所示(模拟数据) 主题ID包含在文本文件标题中(例如“100012_var.txt”) 我想写一个.csv文件,其中一行中的每个值(对于每个主题)都显示在一个新的变量标题下。例如: ID Var1 Var2 Var3 Var4 Var5 Var6 Var7 Var8 Var9 100012 2.97 3.61 -

如果您能就如何在UNIX命令行中运行以下命令提供任何建议,我将不胜感激。基本上,我的每个主题都有文本文件,如下所示(模拟数据)

主题ID包含在文本文件标题中(例如“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

如果有任何建议,我将不胜感激

使用Miller()和perl

您将拥有(这是一个CSV)

然后可以对所有文件执行for循环。

使用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

*
-v RS=“”
已解释。

谢谢你的建议,詹姆斯!如何将脚本的输出转换为.csv文件?只需将输出重定向到新文件,ilke
awk…>输出文件.tsv
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'
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
$ 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