Я перебираю CSV-файл. Каждая строка файла отформатирован что-то вроде этого (это Open Street Maps данные):Распечатать, изменить, снова распечатать Bash variable
planet_85.287_27.665_51a5fb91, AcDbEntity: AcDbPolyline, {[имя] Purano автобусный парк-Thimi [тип] маршрут [маршрут ] микроавтобусами [ссылка] 10} {[Id] 13,0 [SRID] 3857 [FieldsTableId]
Это следует формат:
слой, подклассы, ExtendedEntity, Linetype, EntityHandle, Текст
Я хочу добавить новый столбец для Name
. Я могу найти имя в строке, отрезав все до [name] и after [. Этот код успешно создает новый строковый файл всех имен (который я открываю как CSV, а затем копирую-вставляю в исходный файл в качестве нового столбца).
cat /path/to/myfile.csv | while read line
do
if [[ ${line} == *"name"* ]]
then
printf "$(echo $line | LC_ALL=C sed 's/^.*name\]//g'| LC_ALL=C cut -f1 -d'[') \n"
else
printf "\n"
fi
done >/path/to/newrow.csv
Эта система явно субоптимальна - я бы предпочел напечатать всю итоговую строку. Но когда я заменю эту строку printf следующим образом:
printf "$line,$(echo $line | LC_ALL=C sed 's/^.*name\]//g'| LC_ALL=C cut -f1 -d'[') \n"
Он печатает строку, но не имя. Я попробовал распечатать их в отдельных операторах печати, распечатать строку и затем повторить имя, сохранить имя в переменной, а затем распечатать, а также ряд других методов, и каждый раз, когда я либо: а) печатаю только строку, либо б) напечатайте имя на новой строке, которая разбивает формат CSV.
Что я делаю неправильно? Как распечатать полную исходную строку с именем, добавленным в конце в конце столбца?
Примечание: Я бегу это в терминале на MacOs Sierra на MacBook Pro 15" Retina
FYI - используя 'printf', замены должны быть только в последующих аргументах, а не в самой строке формата. –
... и запускать 'sed' и' cut' один раз в строке очень, * очень * неэффективно - если вы собираетесь выполнять свою обработку поэтапно, попробуйте использовать [bash-native string manipulation] (http://mywiki.wooledge.org/BashFAQ/100). –
@CharlesDuffy спасибо за ввод. Завтра я прочитаю еще несколько справочных страниц. Я занял очень строгий класс на Bash и C, но это было, возможно, 5 месяцев назад, и с тех пор я не делал этого, поэтому на данный момент я совершенно не в курсе! –