Создание/использование собственного символа

Использование переменной AWK FILENAME:

awk 'BEGIN { OFS = "\t"; print "traj", "iter", "states", "gradient"; FS="-|\\." } { gradient=$0; $0=FILENAME; print $2, $4, $6, gradient }' traj-*-iter-*-states-*.gradient

выводит запрошенную строку заголовка, затем обрабатывает каждый файл traj-*-iter-*-states-*.gradient, выводя значения, извлеченные из его имени файла, и его содержимое.

Следующий вариант, основанный на предложении Оливье Дюлака , извлекает строку заголовка из имени файла и использует более простую версиюFS:

awk 'BEGIN { OFS = "\t"; FS="[-.]" } { contents=$0; $0=FILENAME; if (!header) { print $1, $3, $5, $7; header=1 }; print $2, $4, $6, contents }' traj-*-iter-*-states-*.gradient

Вы можете изменить глобус в конце, чтобы он соответствовал интересующим вас файлам, и заголовок будет адаптироваться (к первому обрабатываемому файлу ).

0
26.07.2019, 00:27
3 ответа

Если предположить, что вы имеете в виду UNICODE, а не ASCII, решение будет связано с базой данных символов Unicode .

Глядя на «Основные вопросы» в их FAQ, кажется, что вы, возможно, стремитесь использовать неназначенный символ, который, по-видимому, должен находиться в «областях частного использования», чтобы быть «совместимой реализацией Unicode» .

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

3
28.01.2020, 02:14

Не кажется слишком сложным проанализировать файл журнала, как показано без предложенного #12345магического разделителя. Я буду первым, кто укажет, что это предложение не удовлетворяет " Я хочу, чтобы текст в каждом поле мог содержать ЛЮБОЙ символ ", но я все равно предложу это на на том основании, что имена хостов, имена пользователей и временные метки , вероятно, не содержат пробелов.

cat log

ID Host User Message Timestamp
1 host1 user1 This user did this this and that 11:11:11
2 host1 user2 This other user did this new thing 11:11:51

while IFS=' ' read -r id host user message
do
    timestamp="${message##* }" message="${message% *}"
    printf "%s - %s - %s - %s - %s\n" "$id" "$host" "$user" "$message" "$timestamp"
done <log

ID - Host - User - Message - Timestamp
1 - host1 - user1 - This user did this this and that - 11:11:11
2 - host1 - user2 - This other user did this new thing - 11:11:51
1
28.01.2020, 02:14

Единственный возможный ответ на ваш точный вопрос: «Нет. Символы ASCII представляют собой предварительно -определенный набор из 7 -битовых символов со значениями от 0 -127 и с конкретными значениями, присвоенными каждому из этих значения. Нет возможности добавлять или изменять их».

Я предполагаю, что это не тот вопрос, который вы на самом деле задаете. Вы хотите знать, существует ли (или может быть )гарантированный уникальный разделитель, который можно использовать с любыми входными данными.

Как правило, ответ — нет -это невозможно, этого не существует.

Однако в особых случаях (, т. е. входных данных с известными или легко обнаруживаемыми характеристиками ), обычно можно найти один символ, который маловероятен или гарантированно не может быть найден в поле данных.

Большинство людей используют TAB как разделитель "вряд ли в данных". :тоже популярен (например. /etc/passwd ), если нет полей времени или других данных, которые обычно используют двоеточие. И запятые можно использовать во многих случаях.

Некоторые люди используют правильно сформированный CSV (, то есть с кавычками вокруг строковых полей, которые могут содержать разделитель ). А другие используют JSON или XML или другие форматы структурированного текста. Для этого требуется хороший синтаксический анализатор для точного извлечения данных из них.

Теоретически такой парсер можно было бы написать и на bash. На практике вы действительно не хотите -это гораздо больше работы, чем просто использование правильного инструмента для работы.... или правильного языка (гораздо проще написать хороший парсер на C или perl или python, чем в медленном и очень ограниченном языке, таком как bash)


дополнительная информация :в вашем другом вопросе, вы, кажется, думали, что что-то не так с использованием «сторонних инструментов» в скрипте bash. Ничто не может быть дальше от истины, -что роль сценария оболочки заключается в том, чтобы действовать как «клей» и «со -координатор» между несколькими сторонними -инструментами.Это то, в чем хорош sh/bash.

3
28.01.2020, 02:14

Теги

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