Функция привязки - это именно то, что я искал!
Это надежнее, чем замена строк в исполняемом + может быть легко использована в скриптах...[119342]
#!/bin/bash
for i in {01..84}; do
x=$(printf '%02d' $i)
set -- $x?*.csv
if [ -f "$1" ]; then
cp "$1" $i.csv
shift
if [ -f "$1" ]; then
tail -q -n +2 "$@" >> $x.csv
fi
fi
done
Для каждого префикса устанавливается список файлов с этим префиксом в качестве аргументов, чтобы можно было использовать $1
для доступа к первому и т. д.
Если $1
является файлом (для поиска случая, когда нет файлов с заданным префиксом), затем скопировать этот файл в prefix.csv. Затем проверьте, было ли несколько файлов с этим префиксом, сместив первый файл и проверив, что следующий файл также является файлом. Если это так, пропустите строку заголовка каждого файла с помощью команды tail
и добавьте ее к prefix.csv.
Опция -q
для tail
предназначена для подавления строки заголовка tail
, которая сама будет добавлена, если в списке аргументов будет передано более одного файла; здесь исходили строки = = > 19XXX.csv < =
.
Вероятно, в вашем решении необходима только опция -q
, но я нахожу ее слишком сложной, требующей bash
буферизации выходных данных команды tail
и т.д., что может быть причиной преждевременной остановки сценария (сбой?).
EDIT: добавлено x = $ (printf '% 02d' $ i)
, поскольку {01.. 84}
расширяется до 1 2 3... без ведущих нулей.
С sed
...
getval() { sed "/^\([^=]*,\)*$1[,=]/!d;s/.*=//;q"; } <infile
Возможно, потребуется проверить $1
в качестве входных данных.
Или с GNU grep
и cut
:
getval() { grep -Em1 "^([^=]*,)*$1[,=]" | cut -d= -f2-; } <infile
-121--133726- Можно также использовать realpath
:
% realpath *
/data/code/mdweb/Gemfile
/data/code/mdweb/Gemfile.lock
/data/code/mdweb/README.markdown
realpath
не является POSIX. Он доступен по умолчанию в системах FreeBSD, и в некоторых (но не во всех) системах Linux (но AFAIK может быть установлен как пакет в большинстве, если не во всех системах Linux). Поведение
realpath
может быть различным в различных реализациях, поэтому вышеупомянутое поведение не гарантировано для работы . Я протестировал его на FreeBSD 10 & Arch Linux.
ReadLink
работает только с одним файлом, вам нужен цикл, чтобы сделать это:
for f in *; do
readlink -f -- "$f"
done