Кажется, что у вас есть шесть столбцов, разделенных табуляцией -, но какая-то обработка оставила первое слово 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-й столбец устанавливается равным нулю. Затем выводятся все строки, измененные или нет.
Он ничего не находит, потому что тест -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