我有一列如下:
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 多伊特
根据以下模式/规则:
标头有 3 种类型:AAA、BBB 和 CCC。它们后面的下一行是它们对应的值。
AAA 和 BBB 的值(即它们之后的下一行)不为空。例如:
AAA 血脑屏障
或者
血脑屏障 CCC
看不见。它们永远具有其后的价值。
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