Intereting Posts
Ошибка при установке драйвера? sh recursive copy (cp -r) – Как исключить подпапку Исправлена ​​пересылка X11 на OSX Восстановление определенных файлов из удаленного раздела EXT4 не удалось прочитать файл на ntfs Синергия: подключение не удалось подключиться к серверу: несовместимый клиент 1.3 Linux: Apple Wireless A1314 Fn ключ не зарегистрирован, выглядит как ошибка программного обеспечения Ярлык клавиатуры для перемещения окна в сторону в Gnome Монтаж раздела nfs4 поверх ssh tunel Совместное использование сетевого диска между Linux и Windows Centos 6 и postfix: Внутренние сообщения электронной почты, отложенные / telnet, были отключены из SSH Моя Bluetooth-гарнитура работает, и Linphone работает, но не вместе Почему NetworkManager пытается контролировать скрипт интерфейса, который не существует? Каковы различия между установщиками пакетов? Пусть шифрование – nginx – скрепление OCSP

Solaris использует генератор последовательности в начале каждой новой строки

Я новичок в shell-скриптах. Я создал сценарий, который извлекает данные из базы данных и загружает их в файл csv. Я использую систему SunOS hstz1454 5.10 . Я пытаюсь сделать последовательность в начале каждой строки, следующей за сообщением.

Данные выглядят следующим образом:

 1,1,1535,0,1,Y,Y 1,1,1535,10,2,Y,Y 1,1,1535,20,1,Y,Y 1,1,1535,30,2,Y,Y 1,1,1535,40,1,Y,Y 

Я хочу, чтобы мой файл csv генерировал порядковый номер в начале каждой строки, следующей за запятой:

 1,1,1,1535,0,1,Y,Y 2,1,1,1535,10,2,Y,Y 3,1,1,1535,20,1,Y,Y 4,1,1,1535,30,2,Y,Y 5,1,1,1535,40,1,Y,Y 

Вот мой код только печатает 1 и не увеличивается, как я могу увеличивать каждую новую строку?

 for fname in conv2016_02_cos_speed2percent_data_migration.csv do echo "adds a seq number on each line for $fname" sed 's/.*/1,&/' $fname > tmp.tmp mv tmp.tmp $fname done 

Использовать nl :

 nl -s, -w1 file 

Это добавит инкрементирующий номер в начало каждой строки. -s, указывает, что число и остальная часть строки должны быть разделены запятой. -w1 указывает количество символов, которые будут использоваться для номера строки.


Изменить : Как отметил в комментарии -w1 флаг -w1 сокращает число с более чем 1 цифрой. Это может быть ошибкой реализации Solaris для использования nl utillity. Кроме того, вам может понадобиться количество специальных строк ( -d $'\n\n' ) и emtpy lines (-ba):

 NL=' ' nl -s, -ba -d "$NL$NL" file 

Выход (с GNU coreutils 8.12.197 ):

 $ nl -s, -ba -d "$NL$NL" file 1,4,2,64,1088,80,1,Y,Y 2,5,2,64,1088,95,2,Y,Y 3,8,2,1088,39813120,10,12,Y,Y 4,6,2,1088,39813120,0,2,Y,Y 5,7,2,1088,39813120,5,1,Y,Y 6,8,2,1088,39813120,10,2,Y,Y 

В вашем скрипте он будет выглядеть так:

 NL=' ' for fname in conv2016_02_cos_speed2percent_data_migration.csv; do nl -s, -ba -d "$NL$NL" "$fname" > tmp.tmp && mv tmp.tmp "$fname" done 

Вот путь с awk:

 awk -v OFS=, '{print NR, $0}' < "$fname" > tmp && mv -- tmp "$fname" 

и кошка с sed

 cat -n < "$fname" | sed 's/^[[:blank:]]*\([[:digit:]]*\)[[:blank:]]*/\1,/' > tmp && mv -- tmp "$fname" 

В Solaris используйте /usr/xpg4/bin/sed|awk (или command -p sed|awk если вы используете оболочку POSIX или адаптируете $PATH для получения стандартной среды, подробно описанной в standards(5) ).