Как найти и удалить файлы с символом возврата каретки (\r )в имени файла?

Кажется, что у вас есть шесть столбцов, разделенных табуляцией -, но какая-то обработка оставила первое слово 6-го столбца в 5-м столбце, когда значение в 5-м столбце отсутствует. Вероятно, это связано с тем, что на предыдущем шаге обработки в качестве разделителей использовались пробелы или общие пробелы, а не табуляция.

Теперь вы хотите вставить ноль в 5-ю колонку и переместить там слово на законное место в 6-й колонке.

Я предполагаю, что файл выглядит следующим образом, где каждый ^Iявляется символом табуляции (это вывод cat -tв файле):

GCF_000014165.1_ASM1416v1.dist_nbr_anntn^IWP_011558474.1^I1155234^I1156286^Ipolyketide^Isynthase [Mycobacterium]
GCF_000014165.1_ASM1416v1.dist_nbr_anntn^IWP_011558475.1^I1156298^I1156807^I12^Icarboxyl methyltransferase [Mycobacterium]
GCF_000014165.1_ASM1416v1.dist_nbr_anntn^IWP_011558476.1^I1156804^I1157820^I-3^Ioxidoreductase [Mycobacterium]

Неясно, есть ли пустой столбец 2. Если он есть, просто добавьте один к номерам столбцов, которые я использую ниже.

$ awk -F '\t' 'BEGIN { OFS=FS } $5 ~ /[[:alpha:]]/ { $6 = $5 " " $6; $5 = 0 } { print }' file
GCF_000014165.1_ASM1416v1.dist_nbr_anntn        WP_011558474.1  1155234 1156286 0       polyketide synthase [Mycobacterium]
GCF_000014165.1_ASM1416v1.dist_nbr_anntn        WP_011558475.1  1156298 1156807 12      carboxyl methyltransferase [Mycobacterium]
GCF_000014165.1_ASM1416v1.dist_nbr_anntn        WP_011558476.1  1156804 1157820 -3      oxidoreductase [Mycobacterium]

Здесь я использую awkдля обнаружения любой буквы алфавита в 5-м столбце. Если он есть, перед 5-м столбцом ставится разделительный пробел перед 6-м столбцом, а 5-й столбец устанавливается равным нулю. Затем выводятся все строки, измененные или нет.

1
02.10.2020, 11:36
1 ответ

Он ничего не находит, потому что тест -nameиспользует шелл-шаблон, а глобы ничего не знают \r. Предполагая, что ваша оболочка Cygwin поддерживает нотацию $' ', вы можете сделать:

find. -name '*'$'\r''*'

Итак, для удаления можно сделать:

find. -name '*'$'\r''*' -delete

Или, если у вашего findнет действия -delete, используйте:

find. -name '*'$'\r''*' -exec rm {} +

Тест -regexможет показаться лучшим вариантом, но, к сожалению, ни один из вариантов регулярных выражений, поддерживаемых find, не знает о букве обратной косой черты -. побеги (см. также этот ответ):

$ find. -regextype findutils-default -regex '.*\r.*'
$ find. -regextype ed -regex '.*\r.*'
$ find. -regextype emacs -regex '.*\r.*'
$ find. -regextype gnu-awk -regex '.*\r.*'
$ find. -regextype grep -regex '.*\r.*'
$ find. -regextype posix-awk -regex '.*\r.*'
$ find. -regextype awk -regex '.*\r.*'
$ find. -regextype posix-basic -regex '.*\r.*'
$ find. -regextype posix-egrep -regex '.*\r.*'
$ find. -regextype egrep -regex '.*\r.*'
$ find. -regextype posix-extended -regex '.*\r.*'
$ find. -regextype posix-minimal-basic -regex '.*\r.*'
$ find. -regextype sed -regex '.*\r.*'

У меня работал только первый, с $'\r':

$ find. -name '*'$'\r''*'
./bad?file
2
18.03.2021, 23:00

Теги

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