Ваш вопрос чрезвычайно долог и труден следовать. Вот некоторые ошибки, которые я поймал, могут быть другие.
do read FILENAME;
Это разделяет пробел вначале и конец строки, и выполняет расширение обратной косой черты (таким образом, все обратные косые черты удалены кроме после другой обратной косой черты). Для обработки одной строки буквально использовать
do IFS= read -r FILENAME
Настоящая проблема, с которой Вы сталкиваетесь, является, вероятно, этим:
rm "\"${differentquotes}\""
Вы добавляете символ "
перед именем файла и символом "
после имени файла. Вы говорите rm
удалить файл, имя которого начинается и заканчивается a "
символ. Вы, вероятно, означали удалять файл, имя которого является значением переменной differentquotes
(чье имя не отражает свое значение). Удалить файл, имя которого является значением переменной differentquotes
, использовать
rm -- "$differentquotes"
( --
то, в случае, если аргумент начинается -
; это не необходимо с кодом, который Вы показываете здесь с тех пор find
всегда распечатывает имена, которые не начинаются -
и если я считал Ваше преобразование правильно, оно не рискует представлять то.)
Основное правило правильно обработать имена файлов с пробелом и другими специальными символами состоит в том, чтобы всегда помещать двойные кавычки вокруг замен команды и переменной. Это "$foo"
— кавычки являются частью синтаксиса оболочки. Если Вы имеете \"
где-нибудь, это делает "
характерная роль строки вместо части синтаксиса оболочки.
После этого Вы, кажется, попытались удалить пробелы и вставить их назад. Вы сделали ту же ошибку добавления побочных символов кавычки в том, что Вы используете в качестве имени файла. Кроме того, Вы не можете отложить пробелы, которые Вы удалили — Вы не знали бы сколько пробелов возвращаться или где.
Вы можете сделать понравиться ниже,
awk -F, '{for(i=1;i<=NF;i++)if($i=="Flag10")print i}' file
пример:
$ echo ',Flag2,,Flag4,Flag5,,,,,Flag10,Flag11,Flag12,Flag13' | awk -F, '{for(i=1;i<=NF;i++)if($i=="Flag10")print i}'
10
Для использования awk
builtin's:
awk -F, -v field="Flag10" '{sub(field",.*",field);print split($0,any)}' doc.file
Сценарий удалит все после первого появления значения поля (в данном случае
Flag10
), а затем выведет результат разбиения строки на запятые. Так как мы удалили все после Флаг10
, то в результате получилось количество оставшихся полей, которое является номером поля шаблона поиска.
Я обычно создаю ассоциативный массив, сопоставив названия заголовка к номерам столбцов
awk -F, -v head="Flag10" '
FNR == 1 {for (i=1; i<=NF; i++) col[$i] = i}
{print $col[head]}
' << END
,Flag2,,Flag4,Flag5,,,,,Flag10,Flag11,Flag12,Flag13
10,20,30,40,50,60,70,80,90,100,110,120,130
END
Flag10
100