?[0-9]*
только заменяется именами в текущем каталоге , вторым символом которых является цифра. ls
, при получении имени каталога, очевидно, покажет содержимое этого каталога, а это значит, что вам придется сказать ls
, чтобы он этого не делал.
Вы делаете это сls -d
:
ls -d -- ?[0-9]*
или
ls -d./?[0-9]*
--
и ./
не позволяют ls
интерпретировать первый символ имени файла как вариант, если он начинается с дефиса.
Если вас интересуют только не -каталоги (и вы хотите также отсеять символические ссылки на каталоги ), то есть два очевидных способа сделать это.
Используйте цикл оболочки, проверяя каждое имя, чтобы определить, является ли оно каталогом или нет, и отображайте имя, если это не так:
for name in ?[0-9]*; do
[ ! -d "$name" ] && printf '%s\n' "$name"
done
Чтобы включить файлы, начинающиеся с точки (скрытые файлы ), оболочка может иметь параметр оболочки dotglob
, который можно установить перед циклом(shopt -s dotglob
вbash
).
Используйте find
для поиска не -каталогов (и отсеивания символических ссылок на каталоги )в текущем каталоге:
find -L. -maxdepth 1 ! -type d -name '?[0-9]*'
Опция -L
для find
заставляет -type d
ссылаться на цель любой символической ссылки (, если текущий путь является символической ссылкой ).
$ 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
в конец команды, если вы хотите сохранить его в файле.
Если вы хотите сохранить сортировку, вы можете использовать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__________
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__________
$ 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__________