Сравнение данных по разным столбцам

-name '*.txt'соответствует файлам, имена которых заканчиваются на .txt. Это не будет соответствовать вашему. Используйте шаблон, соответствующий вашим файлам:

find. -name '-file*' -exec cat {} +

Или

cat./-file*

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

Обратите внимание, что --выше не требуется, так как аргументы, переданные в cat, начинаются с ./, а не с -.

Для более точного соответствия (только -file, за которым следуют ровно две десятичные цифры):./-file[0-9][0-9]

0
03.02.2020, 14:04
2 ответа

Возможно, не самая эффективная для очень больших файлов, но рабочая версия.

Ввод файл файл1:

Bin_37:_Pelotomaculum_sp._DTU098        GH3     GH57    GH15    GH18    GT2     GT4     GT28
Bin_45_1:_Thiopseudomonas_denitrificans GH3     GH57    GT2     GT9     CBM48
Bin_99:_to_make_sure_no_columns_is_ok

Скрипт(/bin/sh или /bin/bash):

#!/bin/sh
F="file1";
COLS=$(cat "${F}"|sed 's/^[^\t]*//g;s/\t/\n/g'|sort|uniq|xargs);
# list of all available unique columns in SORTED order
echo "All avaiulable columns: [${COLS}]";
echo
# reading from the file line by line
cat "${F}"|while read L; do
  # assign to A the first column
  A=$(echo "${L}"|cut -d' ' -f1);
  # if A is not empty
  [ -n "${A}" ] && 
  {
    # take one by one all possible column values
    for C in ${COLS}; do
      # if the taken line has such column, add it to A,
      # otherwise add to A NA
      echo "${L} "|grep "\s${C}\s" >/dev/null && 
        A="$A"$'\t'"${C}" || 
        A="$A"$'\tNA'; 
    done;
    # print result line
    echo "${A}";
  };
done

Выход:

All avaiulable columns: [CBM48 GH15 GH18 GH3 GH57 GT2 GT28 GT4 GT9]

Bin_37:_Pelotomaculum_sp._DTU098        NA      GH15    GH18    GH3     GH57    GT2     GT28    GT4     NA
Bin_45_1:_Thiopseudomonas_denitrificans CBM48   NA      NA      GH3     GH57    GT2     NA      NA      GT9
Bin_99:_to_make_sure_no_columns_is_ok   NA      NA      NA      NA      NA      NA      NA      NA      NA

То же(без списка доступных колонок в начале)одним вкладышем:

F="file1"; COLS=$(cat "${F}"|sed 's/^[^\t]*//g;s/\t/\n/g'|sort|uniq|xargs); cat "${F}"|while read L; do A=$(echo "${L}"|cut -d' ' -f1); [ -n "${A}" ] && { for C in ${COLS}; do echo "${L} "|grep "\s${C}\s" >/dev/null && A="$A"$'\t'"${C}" || A="$A"$'\tNA'; done; echo "${A}"; }; done

ОБНОВЛЕНО. Оптимизирована более эффективная версия , основанная на предложениях в комментариях (Требуется /bin/bash):

F="file1"; IFS=$'\n'; COLS=($(sed 's/^[^\t]*//g;s/\t/\n/g' "${F}"|sort -u)); while read -r L; do A="${L%%$'\t'*}"; [ -n "${A}" ] && for C in ${COLS[@]}; do [[ "${L}"$'\t' == *$'\t'"${C}"$'\t'* ]] && A="$A"$'\t'"${C}" || A="$A"$'\tNA'; done && echo "${A}"; done <${F}; IFS=' '
0
28.04.2021, 23:24

При условии, что ваш входной файл хорошо разделен табуляцией, вы можете использовать этот скрипт GNU awk:

awk 'BEGIN{RS="[\t\n]"} !NF{$1="NA"} {printf "%s%s", $0, RT}' file

Разделитель записей RSустанавливается на табуляцию или новую строку, чтобы получить количество полей в NF.

Если NFпусто, то есть между двумя вкладками нет слова, добавляется строка NA.

Сценарий печатает результирующую запись с признаком окончания записиRT(a \tили\n).

0
28.04.2021, 23:24

Теги

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