1

У меня есть 1 столбец, как показано ниже:

AAA
999888
BBB
1111
BBB
2222
AAA
999777
BBB
3333
AAA
999666
BBB
4444
CCC
Doit
...

Рассмотрим выше до нескольких тысяч строк.
Я хочу преобразовать его в таблицу ниже 3 столбцов со строками от AAA до следующей строки AAA:

AAA     BBB     CCC
999888  1111    
999888  2222    
999777  3333    
999666  4444    Doit

Согласно приведенному ниже шаблону / правилам:

  1. Существует 3 типа заголовков: AAA, BBB и CCC. Следующая строка после них - их соответствующие значения.

  2. Значения AAA и BBB (то есть следующие строки после них) не равны нулю. например:

    AAA BBB

    или же

    BBB CCC

    не может быть видно У них всегда будут ценности после них.

  3. Заголовок столбца CCC может не отображаться между 2 записями AAA, как в примере выше. От одного AAA к следующему AAA, если нет CCC, новый столбец CCC будет пуст для этой строки.

Как это сделать в Excel (любая версия)? Perl, shell, awk и т.д. Тоже все в порядке.

1 ответ1

0

я использовал

#!/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

Всё ещё ищете ответ? Посмотрите другие вопросы с метками .