проверить, присутствует ли строка в списке, и вывести третий файл, если строка присутствует

Обратите внимание на положение символа фона и :

test.sh >> log_file 2>&1 &
1
25.10.2016, 16:00
4 ответа

Perl в помощь!

Сохраните элементы списка в хэш, затем прочитайте таблицу, разделите на пробельные символы и проверьте хэш, чтобы вывести 0 или 1.

#!/usr/bin/perl
use warnings;
use strict;

my %in_list;
open my $LIST, '<', 'mylist.tab' or die $!;
while (<$LIST>) {
    chomp;
    $in_list{$_} = 1;
}

open my $TAB, '<', 'data.tab';
while (<$TAB>) {
    my @cells = split;
    print shift @cells, "\t";
    print join "\t", map $in_list{$_} ? 1 : 0, @cells;
    print "\n";
}
2
29.04.2021, 00:08

Другое решение perl

$ perl -lne 'if(!$#ARGV){ $h{$_}=1 }
             else{ s/\h\K\H+/$h{$&} ? 1 : 0/ge; print }
            ' mylist.tab data.tab
Info_1    0     1     1
Info_2    1     0
Info_3    1
Info_4    1     0     0    0    1
Info_5    
  • if (! $ # ARGV) {$ h {$ _} = 1} построить хэш слов в mylist.tab
  • s / \ h \ K \ H + / $ h {$ &}? 1: 0 / ge для строк в data.tab , замените на 1 , если он присутствует в переменной хеширования, иначе 0 . \ h \ K является положительным просмотром назад на наличие пустого места, что позволяет избежать совпадения первого столбца
  • Затем вывести измененную строку
1
29.04.2021, 00:08

Это прямо выражено в awk:

awk 'FNR==NR { h[$1]; next } { for(i=2; i<=NF; i++) $i = ($i in h)? 1 : 0 } 1' mylist.tab data.tab

Или в более читаемом формате:

parse.awk

# Collect mylist.tab into the `h` associative array
FNR==NR {
  h[$1]
  next
}

# For all but the first column in data.tab check and record if it is in `h`
{ 
  for(i=2; i<=NF; i++) 
    $i = ($i in h) ? 1 : 0 
}

# Short for { print $0 }
1

Запустите его следующим образом:

awk -f parse.awk mylist.tab data.tab

Output:

Info_1 0 1 1
Info_2 1 0
Info_3 1
Info_4 1 0 0 0 1
Info_5

Или для столбцов с разделителями табуляции:

awk -v OFS='\t' -f parse.awk mylist.tab data.tab

Output:

Info_1  0   1   1
Info_2  1   0
Info_3  1
Info_4  1   0   0   0   1
Info_5
3
29.04.2021, 00:08

Используйте sed для создания сценария sed из mylist.tab и запуска его на data.tab:

sed \
    -e '1i s/^[ \\t]*//' \
    -e 's@\(.*\)@s/\\([ \\t]\\)\1\\b/\\11/@g' \
    -e '$as/\\([ \\t]\\)[^ \\t]\\{2,\\}\\b/\\10/g' mylist.tab \
    > /tmp/x.sed 
sed -f /tmp/x.sed data.tab

Примечание Я предполагаю, что все строки в "mylist.tab" имеют не менее 2 символов.

2
29.04.2021, 00:08

Теги

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