2015-03-31 3 views
0

Привет Я пытаюсь преобразовать этот исходный файл:Преобразование одного файла в другой

источник --------

[ODBC Data Sources] 
C334_DEV_MD=Micro ODBC Driver for SQL Server Wire Protocol 
C334_PRD_ST=Micro ODBC Driver for SQL Server Wire Protocol 

[ODBC] 
Trace=0 
TraceFile=odbctrace.out 
TraceDll=/home/mstr/Micro/install/lib32/MYtrcXX.so 
InstallDir=/home/mstr/Micro/install 
IANAAppCodePage=106 
UseCursorLib=0 

[C334_DEV_MD] 
HostName=C334WM01NA02 
PortNumber=1433 
Database=C334_DEV_MD 
DoubleToStringPrecision=17 

[C334_PRD_ST] 
HostName=C334WM01NA02 
PortNumber=1433 
Database=C334_PRD_ST 
DoubleToStringPrecision=17 

источник ----------

В этот файл со сценарием.

назначения --------

C334_DEV_MD=Driver description|HostName=C334WM01NA02;PortNumber=1433;Database=C334_DEV_MD;DoubleToStringPrecision=17|na01liwp01c334 
C334_PRD_ST=Driver description|HostName=C334WM01NA02;PortNumber=1433;Database=C334_PRD_ST;DoubleToStringPrecision=17|na01liwp01c334 

назначения ---------

ODBC запись не важно.

Это шаблон, на который должен выводиться результат.

DSN_entry=Driver Description|Parameter1=value;Parameter2=value;Parameter3=value|Server_Name 

Имя сервера может быть взято из имени файла исходного файла.

Это то, что я сделал до сих пор, но я застрял.

#!/bin/bash 
flag=0 
sourcefile=$1 
destfile=$2 
sed -n '2,/^$/p' $sourcefile | awk -F"=" '{print$1}' | sed '$d' | \ 
while read line; do 
     #echo $line 
     grep -E ''"^${line}"'|'"^\[${line}"'' $sourcefile 
done 

ответ

0

Я хотел бы использовать awk:

# Record definitions 
BEGIN { 
    FS="\n"; OFS="|"; RS="\n\n"; ORS="\n" 
} 

# Parse data source descriptions 
$1 ~ /ODBC Data Source/ { 
    for(i=2; i<= NF; i++) { 
     split($i, a, "=") 
     n[a[1]]=a[2] 
    } 
} 

# Output the result record. Replace the datasource id 
# by the description 
$1 ~ /DSN_entry/{ 
    gsub(/\[|\]/,"",$1) 
    print n[$1],$2,$3,$4 
} 

Сохранить выше скрипт в файл translate.awk и назвать его так:

awk -f translate.awk input.file 
+0

Он не производит никакого вывода для меня. Я сохранил ваш код в файле translate.awk и запустил awk -f translate.awk input.file. Нет выхода. – fuzzy186

+0

Хм. Я проверил его с данными, указанными в вопросе. Можете ли вы разместить свои точные данные? (Используете ли вы Linux, что означает 'gawk'?) ​​ – hek2mgl

+0

Это мои входные данные. – fuzzy186

0

Можно было бы взломать что-нибудь вместе для этого с awk, но я думаю, что более разумной альтернативой является использование правильного синтаксического анализатора INI. Например, с помощью Perl и Config::IniFiles:

#!/usr/bin/perl 

use Config::IniFiles; 

# We expect the INI file to be given as first parameter. 
scalar(@ARGV) > 0 || die "Missing parameter"; 

my $hostname = $ARGV[0]; 
$hostname =~ s/odbci_(.*)\.ini/\1/; 

# You may want to also pass -nocase => 1 here, for case-insensitive matching 
my $cfg = Config::IniFiles->new(-file => $ARGV[0]); 

my @sources = $cfg->Parameters('ODBC Data Sources'); 

foreach $source (@sources) { 
    my $line = "$source=" . $cfg->val('ODBC Data Sources', $_); 
    my @params = $cfg->Parameters($source); 

    my $sep = "|"; 
    foreach (@params) { 
     $line .= "$sep$_=" . $cfg->val($source, $_); 
     $sep = ";"; 
    } 

    print "$line|$hostname\n"; 
} 

То же самое в Python 2:

#!/usr/bin/python 

import ConfigParser 
import re 
import sys 

if len(sys.argv) < 2: 
    print "Need input file parameter" 
    sys.exit(1) 

inifile = sys.argv[1] 
hostname = re.search('odbci_(.*)\.ini', inifile, re.IGNORECASE).group(1) 

cfg = ConfigParser.SafeConfigParser() 
cfg.optionxform = lambda option: option 
cfg.read(inifile) 

for source in cfg.options('ODBC Data Sources'): 
    line = source + '=' + cfg.get('ODBC Data Sources', source) 
    sep = '|' 
    for param in cfg.options(source): 
     line = line + sep + param + '=' + cfg.get(source, param) 
     sep = ';' 

    print line + '|' + hostname 

... и в Python 3:

#!/usr/bin/python3 

import configparser 
import re 
import sys 

if len(sys.argv) < 2: 
    print("Need input file parameter") 
    sys.exit(1) 

inifile = sys.argv[1] 
hostname = re.search('odbci_(.*)\.ini', inifile, re.IGNORECASE).group(1) 

cfg = configparser.SafeConfigParser() 
cfg.optionxform = lambda option: option 
cfg.read(inifile) 

for source in cfg['ODBC Data Sources']: 
    line = source + '=' + cfg['ODBC Data Sources'][source] 
    sep = '|' 
    for param in cfg[source]: 
     line = line + sep + param + '=' + cfg[source][param] 
     sep = ';' 

    print(line + '|' + hostname) 

Все они ожидают, будет называться как scriptname odbci_hostname.ini.

+0

Имя «na01liwp01c334» происходит от имени исходного файла - odbci_na01liwp01c334.ini – fuzzy186

+0

В этом случае вы можете сделать что-то вроде 'my $ hostname = $ ARGV [0]; $ hostname = ~ s/odbci _ (. *) \. ini/\ 1 /; 'и позже' print '$ line | $ hostname \ n ";'. – Wintermute

+0

Мне бы очень хотелось избежать использования perl.Похоже, мне нужно будет установить его на серверы, чего я не могу сделать. – fuzzy186

Смежные вопросы