Intereting Posts
как нарезать монтируемое устройство? Выходное видео для перепрограммирования телевизора с графикой Intel Приоритет настроек ядра / proc ipv6 Работает ли ионика с планировщиком сроков? Redhat / Centos 7 Лучшая практика Firewalld для правил pptp или L2TP / IPsec Default sources.list в Debian Jessie (недопустимые зависимости) Переименовать несколько файлов bash молча выполняет функцию return on (re) объявляет глобальный ассоциативный массив только для чтения Выполнение параллельного скрипта из одного задания Cron Что делает запуск «<./somefile.txt» в оболочке? Centos 6 застрял при загрузке заставки после успешной установки Как отправить много команд в оболочку и ждать команды за концами Что произойдет, если скрипт cron попытается скопировать каталог одновременно с записью другого процесса? Raspbian: как ifplugd работает на lo и другом интерфейсе Печать регулярного выражения Sed в файл .txt

Linux преобразует число в строку на 6-й столбец

Я создал сценарий, который извлекает данные из базы данных и загружает их в файл csv. Я использую систему SunOS hstz1454 5.10. Есть ли способ, которым я могу перевести / преобразовать число в строку в файл csv. Поэтому, если мой шестой столбец номер 1 , преобразуйте его в строку Cos4 или если он имеет 2 на 6-м столбце, преобразуйте его в другую строку Cos6 . Я использовал сценарий до этого, чтобы преобразовать последний символ в строку. Возможно, это похоже на то, что я пытаюсь сделать.

 for fname in conv2015_10_TrafficProfile_data_migration.csv do echo "Translate each char to a string $fname" sed s'/S$/STANDARD/g; s/C$/CUSTOMER/g; $fname > tmp.tmp mv tmp.tmp $fname done 

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

 4,2,64,1088,80,1,Y,Y 5,2,64,1088,95,2,Y,Y 6,2,1088,39813120,0,2,Y,Y 7,2,1088,39813120,5,1,Y,Y 8,2,1088,39813120,10,2,Y,Y 

Вы хотите awk. По-моему, почти никогда не было причин использовать sed над awk, для чего угодно, кроме тривиальных подстановок (не намного сложнее, чем sed -e 's/this/that' ). В этом случае это особенно контрпродуктивно.

Вы можете сказать awk использовать в качестве разделителя, используя -F, Мы также можем поместить запятую в OFS переменную awk (разделитель выходных полей), чтобы команда print которая объединяет поля позиционирования, объединяет их с запятой:

 awk -F, 'BEGIN { OFS="," } ...' 

Теперь мы придерживаемся логики. Awk поддерживает своего рода «реактивное программирование», поскольку он позволяет назначать переменные поля позиционирования $1 , $2 , … Когда вы назначаете какой-либо из них, он автоматически восстанавливает переменную $0 которая первоначально содержит строку ввода. Он восстанавливает его, комбинируя позиционные поля, с OFS между ними. Таким образом, мы можем сделать:

 awk -F, 'BEGIN { OFS="," } { if ($6 == 1) $6 = "Cos4" else if ($6 == 2) $6 = "Cos6" print }' yourfile 

Не требуется никакого регулярного выражения; если вы пересматриваете это через шесть месяцев, это будет почти сразу же очевидно, что он делает.

Вышеупомянутый код можно немного упростить, если учесть условные тесты в индивидуальных правилах awk. То есть:

 awk -F, 'BEGIN { OFS="," } $6 == 1 { $6 = "Cos4" } $6 == 2 { $6 = "Cos6" } { print }' yourfile 

Кроме того, мы можем «закодировать гольф» { print } , заменив его на 1 :

 awk -F, 'BEGIN { OFS="," } $6 == 1 { $6 = "Cos4" } $6 == 2 { $6 = "Cos6" } 1' yourfile 

Константа 1 служит булевым истинным условием. Условие не имеет никаких действий, поэтому Awk предоставляет действие по умолчанию, которое является { print } . Однако, если вы пересматриваете это через шесть месяцев, вам придется это запомнить; Сокращение программ таким образом иногда создает будущую задолженность.

С другой стороны, хорошее преобразование, поскольку мы устанавливаем OFS в блоке BEGIN , заключается в том, чтобы избежать опции -F и просто установить FS в том же блоке:

 awk 'BEGIN { FS = OFS = "," } $6 == 1 { $6 = "Cos4" } $6 == 2 { $6 = "Cos6" } { print }' yourfile 

Мы можем использовать сложное задание, очень похожее на язык C. Аналогичные, связанные вещи должны делаться близко друг к другу подобным образом, если это возможно.

 sed -e's/,/&Cos\n/5' \ -e's/\n1/4/' \ -e's/\n2/6/' \ -e's/Cos\n//' <in >out 

Однако я никогда не понимал awk .