Использование переменной 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
Вы можете изменить глобус в конце, чтобы он соответствовал интересующим вас файлам, и заголовок будет адаптироваться (к первому обрабатываемому файлу ).
Если предположить, что вы имеете в виду UNICODE, а не ASCII, решение будет связано с базой данных символов Unicode .
Глядя на «Основные вопросы» в их FAQ, кажется, что вы, возможно, стремитесь использовать неназначенный символ, который, по-видимому, должен находиться в «областях частного использования», чтобы быть «совместимой реализацией Unicode» .
Для получения дополнительной информации (т. е. для того, чтобы быть заваленным часто задаваемыми вопросами ), посмотрите здесь .
Не кажется слишком сложным проанализировать файл журнала, как показано без предложенного #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
Единственный возможный ответ на ваш точный вопрос: «Нет. Символы ASCII представляют собой предварительно -определенный набор из 7 -битовых символов со значениями от 0 -127 и с конкретными значениями, присвоенными каждому из этих значения. Нет возможности добавлять или изменять их».
Я предполагаю, что это не тот вопрос, который вы на самом деле задаете. Вы хотите знать, существует ли (или может быть )гарантированный уникальный разделитель, который можно использовать с любыми входными данными.
Как правило, ответ — нет -это невозможно, этого не существует.
Однако в особых случаях (, т. е. входных данных с известными или легко обнаруживаемыми характеристиками ), обычно можно найти один символ, который маловероятен или гарантированно не может быть найден в поле данных.
Большинство людей используют TAB как разделитель "вряд ли в данных". :
тоже популярен (например. /etc/passwd ), если нет полей времени или других данных, которые обычно используют двоеточие. И запятые можно использовать во многих случаях.
Некоторые люди используют правильно сформированный CSV (, то есть с кавычками вокруг строковых полей, которые могут содержать разделитель ). А другие используют JSON или XML или другие форматы структурированного текста. Для этого требуется хороший синтаксический анализатор для точного извлечения данных из них.
Теоретически такой парсер можно было бы написать и на bash. На практике вы действительно не хотите -это гораздо больше работы, чем просто использование правильного инструмента для работы.... или правильного языка (гораздо проще написать хороший парсер на C или perl или python, чем в медленном и очень ограниченном языке, таком как bash)
дополнительная информация :в вашем другом вопросе, вы, кажется, думали, что что-то не так с использованием «сторонних инструментов» в скрипте bash. Ничто не может быть дальше от истины, -что роль сценария оболочки заключается в том, чтобы действовать как «клей» и «со -координатор» между несколькими сторонними -инструментами.Это то, в чем хорош sh/bash.