1

У меня проблема с САС вне моего понимания. У меня есть солнечная установка, которая генерирует файлы CSV в формате

2012-01-08;00:00;171,297;0,000;    
2012-01-08;00:05;171,297;0,000;
2012-01-08;00:10;171,297;0,000;
2012-01-08;00:15;171,297;0,000;
2012-01-08;00:20;171,297;0,000;
2012-01-08;00:25;171,297;0,000;

Я импортирую эти значения в базу данных MySQL. Я хотел бы, чтобы комбинация из двух первых значений действовала как уникальный первичный ключ.

Результат должен выглядеть так:

2012-01-08;00:00;171,297;0,000;2012-01-08-00:00
2012-01-08;00:05;171,297;0,000;2012-01-08-00:05
2012-01-08;00:10;171,297;0,000;2012-01-08-00:10
2012-01-08;00:15;171,297;0,000;2012-01-08-00:15
2012-01-08;00:20;171,297;0,000;2012-01-08-00:20

3 ответа3

3

Я бы использовал для этого awk , а не sed:

awk -F';' ' NF {print $0 $1"-"$2}'

Куда:

  • -F';': определяет разделитель поля ввода
  • NF: количество полей, используемых здесь для фильтрации строк без полей
  • $0: вся строка
  • $1 и $2: первое и второе поля
  • Остальное, я думаю, говорит само за себя.

Демо-версия:

% echo '2012-01-08;00:00;171,297;0,000;

2012-01-08;00:05;171,297;0,000;

2012-01-08;00:10;171,297;0,000;

2012-01-08;00:15;171,297;0,000;

2012-01-08;00:20;171,297;0,000;

2012-01-08;00:25;171,297;0,000;' | awk -F';' ' NF {print $0 $1"-"$2}'
2012-01-08;00:00;171,297;0,000;2012-01-08-00:00
2012-01-08;00:05;171,297;0,000;2012-01-08-00:05
2012-01-08;00:10;171,297;0,000;2012-01-08-00:10
2012-01-08;00:15;171,297;0,000;2012-01-08-00:15
2012-01-08;00:20;171,297;0,000;2012-01-08-00:20
2012-01-08;00:25;171,297;0,000;2012-01-08-00:25
2

Один из способов использования sed:

sed 's/\(\([^;]*;\)\{2\}\)\(.*\)/\1\2\1/ ; s/;$// ; s/\(.*\);/\1-/' infile

Объяснение:

s/\(\([^;]*;\)\{2\}\)\(.*\)/\1\2\1/     # Match content until second ';' and copy it at the end of the 
                                        # line.
s/;$//                                  # Delete last ';'
s/\(.*\);/\1-/                          # Substitute last ';' with '-'

Результат:

2012-01-08;00:00;00:00;2012-01-08-00:00
2012-01-08;00:05;00:05;2012-01-08-00:05
2012-01-08;00:10;00:10;2012-01-08-00:10
2012-01-08;00:15;00:15;2012-01-08-00:15
2012-01-08;00:20;00:20;2012-01-08-00:20
2012-01-08;00:25;00:25;2012-01-08-00:25
0

Это может работать для вас:

 sed 'h;s/;.*//;H;g;s/\s*\n//' file

Всё ещё ищете ответ? Посмотрите другие вопросы с метками .