У меня есть сценарий awk, и я передал ему файл CSV.
awk -f script.awk /home/abc/imp/asgd.csv
Что я делаю, чтобы получить FILENAME внутри script.awk. FILENAME дает мне весь путь. Поскольку я нахожусь в awk, я не могу использовать basename FILENAME.
print FILENAME;/home/abc/imp/asgd.csv
Я пытался с этим в течение script.awk
echo $FILENAME | awk -F"/"'{print $NF}'
но я не могу выполнить это внутри script.awk. Как я могу попасть asgd.csvв программу awk?
awk '
function basename(file, a, n){
n = split(file, a,"/")return a[n]}{print FILENAME, basename(FILENAME)}' /path/to/file
Обратите внимание, что эти реализации basenameдолжны работать для общих случаев, но не в угловых случаях, например, basename /path/to/x///когда они возвращают пустую строку вместо xили /когда они возвращают пустую строку вместо /, хотя для обычных файлов это не должно происходить.
Первый из них не будет работать должным образом, если пути к файлам (до последнего /) содержат последовательности байтов, которые не образуют допустимых символов в текущей локали (обычно такого рода вещи случаются в локалях UTF-8 с именами файлов, закодированными в некоторых 8 битовый однобайтовый набор символов). Вы можете обойти это, установив локаль на C, где каждая последовательность байтов образует допустимые символы.
Если вам нужен код , который будет работать легко в пределах существующего AWK сценария без введения функции, вы должны использовать: n = split(FILENAME, a, "/"); basename=a[n];. Не используйте, так subкак это на самом деле изменит FILENAMEпеременную (что не является проблемой для функции, так как awk использует вызов по значению).
лучший способ экспортировать его из входного CSV или напрямую из пути к входному файлу - это отменить его, затем получить 1 столбец и затем снова перевернуть его.
В системах , где basenameкоманда доступна, можно использовать awk«s system()функцию или expression | getline varструктуру для вызова внешней basenameкоманды. Это может помочь в учете угловых случаев, упомянутых в ответе Стефана .
n = split(FILENAME, a, "/"); basename=a[n];
. Не используйте, такsub
как это на самом деле изменитFILENAME
переменную (что не является проблемой для функции, так как awk использует вызов по значению).Попробуй это awk one-liner,
источник
awk 'END{ var=FILENAME; n=split (var,a,/\//); print a[n]}' /home/abc/imp/asgd.csv
лучший способ экспортировать его из входного CSV или напрямую из пути к входному файлу - это отменить его, затем получить 1 столбец и затем снова перевернуть его.
или просто
источник
Используйте функцию разделения Awk
Один из способов сделать это - использовать функцию split. Например:
Это даже работает на нескольких файлах. Например:
источник
В системах , где
basename
команда доступна, можно использоватьawk
«ssystem()
функцию илиexpression | getline var
структуру для вызова внешнейbasename
команды. Это может помочь в учете угловых случаев, упомянутых в ответе Стефана .источник