Команда echo
не читает со стандартного ввода, она записывает то, что вы ей говорите. В этом случае вы ничего не говорили ему писать, поэтому он напечатал только новую строку. pwd | echo
эквивалентно простому запуску echo
.
Если вы хотите использовать канал, вам нужно использовать какую-то команду, которая читает из стандартного ввода (, например,cat
):
$ pwd | cat
/path/to/current/directory
$
Спецификация задачи:
(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