Как выбрать только информацию, начинающуюся с шаблона в столбце, и печатать в другом

a )Работаapt install filemanager-actions-nautilus-extension

b )РаботаFileManager-Actions Configuration Tool

c )Файл => Новое действие

d01)Actionвкладка :МеткаDisplay item in location context menu

FileManager Actions a

d02)Commandвкладка:

  • Путь:/usr/bin/tilix
  • Параметры:--working-directory=%d/%b
  • Рабочий каталог:%d

FileManager Actions b

e )Перезапустите Наутилус

1
23.06.2021, 11:09
5 ответов

С POSIX awkмы можем сделать, как показано. Разделите третье поле через запятую для строк> 1 и выберите те элементы, которые начинаются с S :, а затем соедините их запятой и сделайте это поле последним + 1.

awk -F '\t' '
  BEGIN {
    OFS = FS
    _SEP_ = ","
  }

  NR==1{$(NF+1) = "S_mutation"}

  NR>1&&length($3)>0{
    nf = split($3, a, _SEP_)
    t = ""
    for (i=1; i<=nf; i++) {
      if (a[i] ~ /^S:/) {
        t = t (t=="" ? t : _SEP_) a[i]
      }
    }
    $(NF+1) = t
  }1
' file

То же самое в Perl, но с использованием регулярных выражений

perl -lnse '$,="\t";
  print $_,($.==1?q(S_mutation):
  "@{[/(?:\t|,)\KS:[^,]*/g]}"||());
' -- -\"=,./file

Выход:

id   clade  mutation             S-mutation
243  40A    S:ojo,L:juju,S:lili  S:ojo,S:lili
254                              
267  40B    J:jijy,S:asel,M:ase  S:asel
4
28.07.2021, 11:22

Использованиеawk(POSIX ).

awk -F "\t" '
BEGIN   { OFS = FS }
NR == 1 { $4 = "S_Mutation" }
NR  > 1 && NF == 3 {
    printf "%s", $0 "\t"
    $0 = $3
    gsub(/[^S]:[^,]*,?/, "")
    sub(/,$/, "")
    print $1
    next
}
1' data.txt
  • Если строка > 1 и количество полей = 3
    • Печатать строку без конца новой строки
    • Установить строку = поле 3
    • Удалить строки, не начинающиеся сS:
    • Удалить запятую в конце
    • Поле печати с новой строкой
    • Обработка следующей строки
  • Другое
    • Печать строки

Возможно, вы захотите не печатать конечную вкладку, проверить, является ли $1чем-то после подстановки, а затем напечатать TAB+ поле. (В случае, если вы не хотите, чтобы табуляция заканчивалась в строках, где нет S:xxxполей. Что-то вроде:

    # Print line
    printf "%s", $0
    # Set line = field 3
    $0 = $3
    # Replace all N:xxx where N is not S
    gsub(/[^S]:[^,]*,?/, "")
    # Remove trailing comma
    sub(/,$/, "")
    # Print the field
    if ($1 != "")
        print "\t"$1
    else
        print ""
    # Continue with next line
    next
3
28.07.2021, 11:22

Если вы не против использоватьsed:

sed 'h;s/.*[[:space:]]/,/;s/,[^S]:[^,]*//g;x;G;s/\n,/\t/'

Обратите внимание, что \tбудет работать только с GNU sed. Для других вариантов вставьте литеральную вкладку, обычно вводя ctrlv , а затем клавишу табуляции.

Идея состоит в том, чтобы сохранить строку в резервном пространстве, затем изолировать последний столбец и удалить все мутации, кроме S:. Затем добавьте это как последний столбец к сохраненной строке:

  • hкопирует строку в область хранения
  • s/.*[[:space:]]/,/заменяет все до последней табуляции или пробела запятой, так что остается последний столбец с предваряемой запятой. Эта запятая поможет на следующем шаге
  • s/,[^S]:[^,]*//gудаляет все элементы, кроме S:
  • xменяет местами пространство хранения и пространство шаблона, поэтому Gдобавит новый столбец к исходному столбцу, хранящемуся в пространстве хранения
  • s/\n,/\t/наконец, заменяет новую строку из добавления и запятую, которую мы ввели табуляцией
1
28.07.2021, 11:22

С Perl

perl -F'\t' -lpe '
    push @F, $. == 1 ? "S_mutation" : join ",", grep { /^S:/ } split /,/, $F[2];
    $_ = join "\t", @F
' A.tsv > B.tsv

Пр.

$ perl -F'\t' -lpe '
    push @F, $. == 1 ? "S_mutation" : join ",", grep { /^S:/ } split /,/, $F[2];
    $_ = join "\t", @F
' A.tsv | column -t
id   clade  mutation             S_mutation
243  40A    S:ojo,L:juju,S:lili  S:ojo,S:lili
254
267  40B    J:jijy,S:asel,M:ase  S:asel
2
28.07.2021, 11:22
awk 'BEGIN{ FS=OFS="\t" }
{ c3=$3; gsub(/(^|,)[^S]*(,|$)/, ",", c3); gsub(/^,+|,+$/, "", c3)
  print $0, (NR==1?"S_Mutation":c3)
}' infile

FS — разделитель полей ввода, а OFS — разделитель полей вывода; оба мы устанавливаем на символ Tab \t; затем мы взяли резервную копию из 3-го rd поля c3=$3для замены и сохранения оригинала нетронутым.

затем первая функция gsub ()заменяет те подполя -(, которые они разделены символом запятой )с запятой, если она не начинается с Schar; второй gsub ()удаляет начальную(^,+)/ конечную(,+$)запятую (s ), чтобы они могли появиться после некоторого удаления.

, затем мы печатаем всю строку, за которой следует конечное значение переменной c3или S_Mutationстрока, если это была первая строка, в которой тернарный оператор(condition?if-true:if-false)управляет тем, что печатать при выполнении условия.

2
28.07.2021, 11:22

Теги

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