Найдите число FN с awk

Ваш вопрос чрезвычайно долог и труден следовать. Вот некоторые ошибки, которые я поймал, могут быть другие.

do read FILENAME;

Это разделяет пробел вначале и конец строки, и выполняет расширение обратной косой черты (таким образом, все обратные косые черты удалены кроме после другой обратной косой черты). Для обработки одной строки буквально использовать

do IFS= read -r FILENAME

Настоящая проблема, с которой Вы сталкиваетесь, является, вероятно, этим:

rm "\"${differentquotes}\""

Вы добавляете символ " перед именем файла и символом " после имени файла. Вы говорите rm удалить файл, имя которого начинается и заканчивается a " символ. Вы, вероятно, означали удалять файл, имя которого является значением переменной differentquotes (чье имя не отражает свое значение). Удалить файл, имя которого является значением переменной differentquotes, использовать

rm -- "$differentquotes"

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

Основное правило правильно обработать имена файлов с пробелом и другими специальными символами состоит в том, чтобы всегда помещать двойные кавычки вокруг замен команды и переменной. Это "$foo" — кавычки являются частью синтаксиса оболочки. Если Вы имеете \" где-нибудь, это делает " характерная роль строки вместо части синтаксиса оболочки.

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

2
02.03.2015, 18:24
3 ответа

Вы можете сделать понравиться ниже,

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
3
27.01.2020, 21:51

Для использования awk builtin's:

awk -F, -v field="Flag10" '{sub(field",.*",field);print split($0,any)}' doc.file

Сценарий удалит все после первого появления значения поля (в данном случае Flag10), а затем выведет результат разбиения строки на запятые. Так как мы удалили все после Флаг10, то в результате получилось количество оставшихся полей, которое является номером поля шаблона поиска.

3
27.01.2020, 21:51

Я обычно создаю ассоциативный массив, сопоставив названия заголовка к номерам столбцов

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
2
27.01.2020, 21:51

Теги

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