Как извлечь определенные данные (с помощью строки и разделителя )из нескольких текстовых файлов в таблицу Excel?

Команда echoне читает со стандартного ввода, она записывает то, что вы ей говорите. В этом случае вы ничего не говорили ему писать, поэтому он напечатал только новую строку. pwd | echoэквивалентно простому запуску echo.

Если вы хотите использовать канал, вам нужно использовать какую-то команду, которая читает из стандартного ввода (, например,cat):

$ pwd | cat
/path/to/current/directory
$ 
1
24.08.2020, 18:42
1 ответ

Спецификация задачи:

(1 )Чтение и сбор данных из большого количества файлов, хранящихся в одном указанном каталоге. Каждое имя файла уникально в первых 11 символах, а последние 7 символов имени должны быть _M0_mlc.

(2 )Файлы представляют собой обычный текст с пробелом -и в основном в свободном формате -.

(3 )Извлекаемые данные обозначаются специальным текстом, как указано в списке. Для каждого файла будет использоваться только первое такое совпадение.

lnL
kappa
omega
tree length for dN
tree length for dS

Следующее за ним действительное число в той же текстовой строке должно быть значением для вывода. Для любого файла, в котором такой конкретный текст или значение не найдено, должно быть выведено значение N/A.

(4 )Выходные данные должны представлять собой таблицу с одним столбцом, как показано в вопросе, по одной строке на входной файл.

(5 )Все остальные данные в любом файле игнорируются.

(6 )[так как в заголовке упоминается рабочий лист Excel]. Должна быть предусмотрена возможность вывода данных в виде текстового файла CSV (со значениями, разделенными запятыми ), который подходит для импорта в Excel.

Это проверенный скрипт, который работает в соответствии с примечаниями выше. Он был протестирован с использованием файла, опубликованного в вопросе, а также некоторых взломов данных для проверки некоторых условий (, таких как отсутствующие данные ).

Тестовый файл состоит из 166 строк, и я сделал 2600 копий для тестирования производительности. На моем ноутбуке он запускает 2600 файлов по 166 строк за 1,25 секунды, что составляет около 300 000 строк в секунду. Ваши файлы размером 512 КБ примерно в 40 раз больше, поэтому он может обработать всю партию за одну минуту.

Требуется аргумент -c, если вы хотите, чтобы вывод CSVимпортировался в Excel.

Paul--)./awkFastParse
DataSet      lnL                kappa (ts/tv)      omega (dN/dS)      tree length for dN tree length for dS
EOA100W06LO  -5160.995083       1.50195            0.05318            0.6637             12.4810           
EOA110W06LO  -5160.995083       1.50195            0.05318            0.6637             12.4810           
EOA120W06LO  N/A                N/A                N/A                N/A                N/A               
EOA130W06LO  -5160.995083       N/A                0.05318            0.6637             12.4810           
EOA140W06LO  -5160.995083       N/A                0.05318            0.6637             12.4810           
EOA150W06LO  -5160.995083       1.50195            0.05318            0.6637             12.4810           
EOA160W06LO  N/A                N/A                N/A                0.6637             12.4810           
EOA170W06LO  -5160.995083       1.50195            0.05318            0.6637             12.4810           
EOA180W06LO  -5160.995083       1.50195            0.05318            0.6637             12.4810           
Paul--) 
Paul--)./awkFastParse -c
DataSet,lnL,kappa (ts/tv),omega (dN/dS),tree length for dN,tree length for dS
EOA100W06LO,-5160.995083,1.50195,0.05318,0.6637,12.4810
EOA110W06LO,-5160.995083,1.50195,0.05318,0.6637,12.4810
EOA120W06LO,N/A,N/A,N/A,N/A,N/A
EOA130W06LO,-5160.995083,N/A,0.05318,0.6637,12.4810
EOA140W06LO,-5160.995083,N/A,0.05318,0.6637,12.4810
EOA150W06LO,-5160.995083,1.50195,0.05318,0.6637,12.4810
EOA160W06LO,N/A,N/A,N/A,0.6637,12.4810
EOA170W06LO,-5160.995083,1.50195,0.05318,0.6637,12.4810
EOA180W06LO,-5160.995083,1.50195,0.05318,0.6637,12.4810
Paul--) 

В настоящее время сценарий берет файлы из подкаталога «Данные», обрезает любой путь и расширение «_M0 _mlc». Это может потребовать некоторых изменений, чтобы соответствовать вашим потребностям. Напишите, если вам нужно что-то улучшить.

#! /bin/bash --

[[ "${1}" = "-c" ]] && { Csv=1; shift; }    #.. Option to set CSV output.

awkFastParse () {

    AWK='
BEGIN {
    txTitle = "DataSet,lnL,kappa (ts/tv),omega (dN/dS)," \
        "tree length for dN,tree length for dS";
    split (txTitle, Title, /,/);
    fmtCSV = "%s,%s,%s,%s,%s,%s\n";
    fmtCol = "%-12s %-18s %-18s %-18s %-18s %-18s\n";
    fmtRow = (Csv) ? fmtCSV : fmtCol;
    printf (fmtRow, Title[1], Title[2], Title[3], Title[4], Title[5], Title[6]);

    stderr = "cat 1>&2"; NUL = "\000"; NL = RS; RS = NUL;
    reAnyTag = "(lnL|kappa|omega|tree length for (dN|dS))";
    reValue = "[-+]?[0-9]+[.][0-9]+";
    Tag["lnL"]; Tag["kappa"]; Tag["omega"];
    Tag["tree length for dN"]; Tag["tree length for dS"];
}

function doFile (fn, Local, g, Set, fnr, txt, tag, j, cut, value) {

    RS = NL;
    while ((g = (getline txt < fn)) > 0) {
        ++fnr;
        #.. Optimisation -- skip any line that does not contain a Tag.
        if (txt !~ reAnyTag) continue;
        #.. Find all tags in this line.
        for (tag in Tag) {
            #.. Only take the first value in any file.
            if (tag in value) continue;
            #.. Locate the tag, or skip.
            if ((j = index (txt, tag)) == 0) continue;
            #.. Isolate the rest of the line.
            cut = substr (txt, j);
            #.. The value is the next real number.
            if (match (cut, reValue)) {
                value[tag] = substr (cut, RSTART, RLENGTH);
            }
        }
        #.. Optimisation -- if we have one of each value, skip the file.
        if (length (value) == length (Tag)) break;
    }
    if (g < 0) printf ("%s: %s\n", fn, ERRNO) | stderr;
    close (fn);
    RS = NUL;
    #.. Format and print the line for this file.
    Set = fn; sub (/^.*\//, "", Set); sub (/_M0_mlc$/, "", Set);
    for (tag in Tag) if (! (tag in value)) value[tag] = "N/A";
    printf (fmtRow, Set, value["lnL"], value["kappa"], value["omega"],
        value["tree length for dN"], value["tree length for dS"]);
}

{ doFile( $0); }
'
    awk -v Csv="${Csv}" -f <( printf '%s' "${AWK}" )
}


#.. Generate a list of file names with null terminations.

    find Data -name '*_M0_mlc' -print0 | sort -z | awkFastParse
0
18.03.2021, 23:10

Теги

Похожие вопросы