根据值将单列转换为多列

根据值将单列转换为多列

我有一列如下:

AAA
999888
血脑屏障
1111
血脑屏障
2222
AAA
999777
血脑屏障
3333
AAA
999666
血脑屏障
4444
CCC
...

考虑上面几千行。
我想将其转换为以下 3 列表格,行从 AAA 到下一个 AAA 行:

AAA BBB CCC
999888 1111    
999888 2222    
999777 3333    
999666 4444 多伊特

根据以下模式/规则:

  1. 标头有 3 种类型:AAA、BBB 和 CCC。它们后面的下一行是它们对应的值。

  2. AAA 和 BBB 的值(即它们之后的下一行)不为空。例如:

    AAA
    血脑屏障

    或者

    血脑屏障
    CCC

    看不见。它们永远具有其后的价值。

  3. 2 个 AAA 条目之间可能看不到 CCC 列标题,如上例所示。从一个 AAA 到下一个 AAA,如果没有 CCC,则该行的新 CCC 列将为空。

在 Excel (任何版本) 中执行此操作的方法是什么?Perl、shell、awk 等都可以。

答案1

我用过

#!/bin/bash
input_file=${1}
declare -A columns
SEP='\t'
curr_level=0
headers=""
while read line; do
if [ -n "${column}" ]; then
    for (( i=${curr_level}; i<${columns[$column]}; i++ )); do
        echo -ne ${SEP} >> tmpout.txt
    done
    curr_level=${columns[$column]}
    echo -n ${line} >> tmpout.txt
    column=""      
else
    column="${line}"
    if [ -z "${columns[$line]}" ]; then
        columns[$line]="${#columns[@]}"
        headers+="${line}${SEP}"
    elif [ ${columns[$line]} -le $curr_level ]; then
        echo "" >> tmpout.txt
        curr_level=0
    fi
fi             
done < $input_file

echo -e $headers | cat - tmpout.txt >> out.txt
unset columns column headers
rm tmpout.txt

将其放入一个文件,例如 script.sh,使其可执行并调用script.sh file_to_format.sh。它将创建一个名为 的文件out.txt,包含结果,以及一个名为 的文件tmpout.txt,该文件将被删除,用于临时计算。

笔记:这将留下垂直间隙,例如

AAA     BBB     CCC     
999888  1111
        2222
999777  3333
999666  4444    Doit

相关内容