grep между двумя списками

?[0-9]* только заменяется именами в текущем каталоге , вторым символом которых является цифра. ls, при получении имени каталога, очевидно, покажет содержимое этого каталога, а это значит, что вам придется сказать ls, чтобы он этого не делал.

Вы делаете это сls -d:

ls -d -- ?[0-9]*

или

ls -d./?[0-9]*

--и ./не позволяют lsинтерпретировать первый символ имени файла как вариант, если он начинается с дефиса.

Если вас интересуют только не -каталоги (и вы хотите также отсеять символические ссылки на каталоги ), то есть два очевидных способа сделать это.

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

    for name in ?[0-9]*; do
        [ ! -d "$name" ] && printf '%s\n' "$name"
    done
    

    Чтобы включить файлы, начинающиеся с точки (скрытые файлы ), оболочка может иметь параметр оболочки dotglob, который можно установить перед циклом(shopt -s dotglobвbash).

  2. Используйте findдля поиска не -каталогов (и отсеивания символических ссылок на каталоги )в текущем каталоге:

    find -L. -maxdepth 1 ! -type d -name '?[0-9]*'
    

    Опция -Lдля findзаставляет -type dссылаться на цель любой символической ссылки (, если текущий путь является символической ссылкой ).

3
26.05.2020, 11:48
4 ответа
$ join -a 1  <( sort list.txt ) <( sort list_interactors.txt )
2dr5_D_2-3__________
3erf_1_001__________ 3erf2_B QAEF6R XXXXX
6tyr_A_002__________ 6tyr1_B QRT54R AAAAA
7yer_2_009__________

Здесь используется joinдля выполнения реляционной операции JOIN между двумя файлами. По умолчанию первое поле будет использоваться как ключ соединения.

Опция -a 1заставляет joinвыводить все строки в первом файле, даже если нет совпадения во втором файле (выполняется "левое соединение" ).

Входные данные для joinнеобходимо отсортировать, и мы делаем это, вызывая sortдля каждого файла отдельно в двух подстановках процесса в командной строке. Вы также можете выбрать предварительную -сортировку файлов.

Если ваши данные разделены табуляцией -, вы можете добавить -t $'\t'в начало аргументов команды join. Это заставит вывод сохранить существующие разделители табуляции.

Перенаправьте вывод, добавив >output.txtв конец команды, если вы хотите сохранить его в файле.

12
18.03.2021, 23:33

Если вы хотите сохранить сортировку, вы можете использоватьawk:

awk '
    FNR==NR {s[$1]=$0}
    FNR!=NR {if(s[$1]) print s[$1]; else print $0}
' list_interactors.txt list.txt

Выход:

6tyr_A_002__________    6tyr1_B    QRT54R   AAAAA
7yer_2_009__________
3erf_1_001__________    3erf2_B    QAEF6R   XXXXX
2dr5_D_2-3__________
4
18.03.2021, 23:33

Perl one liner также может выполнять:

$ perl -ane ' { chomp;$s{$F[0]}=$_; } END { print "$s{$_}\n" for sort(keys(%s))  }' list.txt list_interactors.txt 
2dr5_D_2-3__________
3erf_1_001__________    3erf2_B    QAEF6R   XXXXX
6tyr_A_002__________    6tyr1_B    QRT54R   AAAAA
7yer_2_009__________
0
18.03.2021, 23:33
$ awk 'NR==FNR{a[$1]=$0; next} {print ($1 in a ? a[$1] : $0)}' list_interactors.txt list.txt
6tyr_A_002__________    6tyr1_B    QRT54R   AAAAA
7yer_2_009__________
3erf_1_001__________    3erf2_B    QAEF6R   XXXXX
2dr5_D_2-3__________
0
18.03.2021, 23:33

Теги

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