按顺序合并.CSV行



在分析脑扫描后,我最终得到了约1000 .csv文件,每次扫描一个。我已经按顺序将它们合并为一个(按主题ID和日期)。我的问题是,有些受试者连续两次扫描,而有些则只有一个。数据库现在看起来像:

ID, CC_area, CC_perimeter, CC_circularity
024_S_0985, 407.00, 192.15, 0.138530          //first scan of A
024_S_0985, 437.50, 204.80, 0.131074          //second scan of A
024_S_0985, 400.75, 198.80, 0.127420          //third scan  of A
024_S_1063, 544.50, 214.34, 0.148939          //first and only scan of B
024_S_1171, 654.75, 240.33, 0.142453          //first scan of C
024_S_1171, 659.50, 242.21, 0.141269          //second scan of C
...

,但我希望它看起来像:

ID, CC_area, CC_perimeter, CC_circularity, CC_area2, CC_perimeter2, CC_circularity2, CC_area3, CC_perimeter3, CC_circularity3, ..., CC_circularity6
024_S_0985, 407.00, 192.15, 0.138530, 437.50, 204.80, 0.131074, 400.75, 198.80, 0.127420, ... , 
024_S_1063, 544.50, 214.34, 0.148939,,,,,, ..., 
024_S_1171, 654.75, 240.33, 0.142453, 659.50, 242.21, 0.141269,,, ... , 
...

重要的是,数据顺序不得更改,并且一个ID的行数不知道(从1到6不知道)。(因此,扫描1的第一列,然后是扫描2等)。您能帮我或提供使用Bash的解决方案吗?我没有经验丰富的编程,我失去了希望,我可以自己做。

您可以使用普通的while read循环将行与同一文件名(或初始索引)结合起来,然后在3个条件下进行操作。(1)它是否是标头遵循的第一行;(2)当前索引等于最后一个;和(3),其中当前索引与最后一个不同。有多种方法可以解决此问题,但是简短的bash脚本看起来如下:

#!/bin/bash
fn="${1:-/dev/stdin}"       ## accept filename or stdin
[ -r "$fn" ] || {           ## validate file is readable
    printf "error: file not found: '%s'n" "$fn"
    exit 1
}
declare -i cnt=0            ## flag for 1st iteration
while read -r line; do      ## for each line in file
    ## read header, print & continue
    [ ${line//,*/} = ID ] && printf "%sn" "$line" && continue
    line="${line//  */}"            ## strip //first scan of A....
    idx=${line//,*/}                ## parse file index from line
    line="${line#*, }"              ## strip index
    if [ $cnt -eq 0 ]; then         ## if first line - print
        printf "%s, %s" "$idx" "$line"
        ((cnt++))
    elif [ $idx = $lidx ]; then     ## if indexes equal, append
        printf ", %s" "$line"
    else                            ## else, newline & print
        printf "n%s, %s" "$idx" "$line"
    fi
    last="$line"            ## save last line
    lidx=$idx               ## save last index
done <"$fn"
printf "n"

输入

$ cat dat/cmbcsv.dat
ID, CC_area, CC_perimeter, CC_circularity
024_S_0985, 407.00, 192.15, 0.138530          //first scan of A
024_S_0985, 437.50, 204.80, 0.131074          //second scan of A
024_S_0985, 400.75, 198.80, 0.127420          //third scan  of A
024_S_1063, 544.50, 214.34, 0.148939          //first and only scan of B
024_S_1171, 654.75, 240.33, 0.142453          //first scan of C
024_S_1171, 659.50, 242.21, 0.141269          //second scan of C

输出

$ bash cmbcsv.sh dat/cmbcsv.dat
ID, CC_area, CC_perimeter, CC_circularity
024_S_0985, 407.00, 192.15, 0.138530, 437.50, 204.80, 0.131074, 400.75, 198.80, 0.127420
024_S_1063, 544.50, 214.34, 0.148939
024_S_1171, 654.75, 240.33, 0.142453, 659.50, 242.21, 0.141269

注意:我不知道您是否需要所有其他逗号或椭圆机,或者它们是否在那里显示可能有更多相同的索引(例如,,...,)。如果需要,您可以轻松添加它们。

好吧,如果您知道哪个扫描属于哪个人,您可以添加一个额外的列(例如患者名称或ID),但我想如果您有有关每人扫描多少的原始信息

相关内容

  • 没有找到相关文章

最新更新