Линейное сравнение двух файлов, и если образец файла 1 не найден (полностью или частично) в файле 2, то напечатайте строку файла 1

Я думаю, это проще всего.

ps -ef | ( head -n 1 ; sort )

или вот это, что возможно быстрее, так как не создается под-оболочка

ps -ef | { head -n 1 ; sort ; }

Другие классные применения

перестановка строк после строки заголовка

cat file.txt |  ( head -n 1 ; shuf )

разворот строк после строки заголовка

cat file.txt |  ( head -n 1 ; tac )
3
12.03.2018, 13:38
3 ответа
grep -vxf <(grep -of file_1 file_2 | sort -u) file_1

файл _1

1
GACGGAGGATGCAAGTGTTATCCGGAATCACTGGGCGTAAAGTTTTTTTTT
2
GACGGAGGATGCAAGTGTTATCCGGAAT
3
GACGGAGGATGCAAGTGTTATCCGGAATCACTGGGCGTAAAGCGTCC
4
GACGGAGGATGCAAGTGTTATCCGGAATCACTGGGCCGTCCGTAG

файл _2

GACGGAGGATGCAAGTGTTATCCGGAATCACTGGGCGTAAAGC
GACGGAGGATGCAAGTGTTATCCGGAATCACTGGGCGTAAAGCG
GACGGAGGATGCAAGTGTTATCCGGAATCACTGGGCGTAAAGCGTCC
GACGGAGGATGCAAGTGTTATCCGGAATCACTGGGCGTAAAGCGTCCGTAG

Выход

1
GACGGAGGATGCAAGTGTTATCCGGAATCACTGGGCGTAAAGTTTTTTTTT
2
3
4
GACGGAGGATGCAAGTGTTATCCGGAATCACTGGGCCGTCCGTAG
0
27.01.2020, 21:25

awk+grepраствор:

awk '/^[^>0-9]/{ 
         m = ""; cmd = sprintf("grep -m1 %s file2", $0);
         cmd | getline m; close(cmd);
         if (m) next; 
     }1' file1
  • cmd-критическая grepкоманда
  • m-переменная, заполненная возможным совпадающим элементом

Выход:

1
GACGGAGGATGCAAGTGTTATCCGGAATCACTGGGCGTAAAGTTTTTTTTT
2
3
4
GACGGAGGATGCAAGTGTTATCCGGAATCACTGGGCCGTCCGTAG
0
27.01.2020, 21:25

Использование скрипта awk:

NR == FNR       { seq[++n] = $1; next }

{
    header = $0
    getline

    for (i = 1; i <= n; ++i) {
        if (match(seq[i], $0) > 0) {
            print header
            next
        }
    }

    print header
    print
}

Запуск:

$ awk -f script.awk file2 file1
1
GACGGAGGATGCAAGTGTTATCCGGAATCACTGGGCGTAAAGTTTTTTTTT
2
3
4
GACGGAGGATGCAAGTGTTATCCGGAATCACTGGGCCGTCCGTAG

Скрипт сначала считывает 2000 последовательностей из file2в массив seq,а затем читает заголовок из file1, за которым следует последовательность из file1(, используя getline). Затем он проходит через массив seq, чтобы найти последовательность, содержащую текущую последовательность из file1. Если такая последовательность найдена, печатается заголовок, и скрипт переходит к следующей строке в file1. В противном случае печатаются и заголовок, и последовательность.

Сценарий предполагает, что file1содержит чередующиеся строки заголовка и строки последовательности и абсолютно не содержит многострочной последовательности -.

Ниже приведен тот же сценарий, но с использованием СУХОГО принципа («Не повторяйся»):

NR == FNR       { seq[++n] = $1; next }

{
    header = $0
    getline

    found = 0
    for (i = 1; i <= n; ++i) {
        if (match(seq[i], $0) > 0) {
            found = 1
            break
        }
    }

    print header
    if (!found) print
}
2
27.01.2020, 21:25

Теги

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