Это не такой уж большой вопрос. Это и мой первый пост. Я не новичок ie, но я только начинаю изучать awk.
Недавно мне пришлось сгенерировать некоторые. xml файлы конфигурации из двух наборов данных, которые изначально не сохраняются as xml.
Я много искал помощь AWK, но понимаю, что 99% предоставленных скриптов используют продвинутые методы AWK, что затрудняет понимание новичками. Я верю, что это и отвлечет интерес, и повысит кривую обучения.
EG. awk '{/ ERROR /}' </ var / log / messages </p>
Человеку, который не выполняет много сценариев awk, не очень легко узнать, что там происходит, но он делает множество.
Итак, здесь я собираюсь предоставить новый ie подход для выполнения такой задачи. Взамен
Я хотел бы получить предложения по
- более оптимизированной версии newb ie.
- оптимизированной расширенной версии с надлежащим объяснением, которое поможет при переходе .
$. / Test1.awk Samfig2.cfg user1.tsv $ ls cfg * cfg2ZR6ZS29XXOF. xml cfg42IXEIGOQ0FG. xml cfg759YUZKTS368CP. xml cfgNTQUE * 1057AL * cfgNTX *
test1.awk
#!/usr/bin/awk -f
BEGIN {
configfile=ARGV[1]
Userfile=ARGV[2]
if (ARGV[2] == "") {
print "ERROR: Need two files Usage "ENVIRON["_"]" Config.cfg Users.tsv" >"/dev/stderr"
exit }
ARGV[1] = "" # We want to control the manipulation of files
ARGV[2] = ""
FS = "=" ; # this is being done dynamically, no need here (oh yes setting here cause almost 90% execution reduction)
getline Header < Userfile; # advance the Header line and get the headers
gsub("\r","",Header); # My production version doesnt need this but the sample data seem to include \r on the end field
HeaderN=split(Header,Headarray,"\t");
# Expand begin block to include {} below to prevent pause for input }
#{
while ((getline User < Userfile) >0 ) # Read row from field into variable User do all the blocks below based on the number of records in Userfile.
{
gsub("\r","",User); # My production version doesnt need this but the sample data seem to include \r on the end field
n=split(User,Detailsarray,"\t"); # split row stored in User into array called Detailsarray n stores the total number of elements with FS =\t
filetostore=("cfg" Detailsarray[HeaderN] ".xml"); # Were are storing each file based on Last Header value in the user file
Recordtmp="" #To reduce file IO will append to string then output later.
Recordtmp ="<?xml version=\42""1.0\42 encoding=\42utf-8\42?>"; #\42 is the double quote ". Result is <?xml version="1.0" encoding="utf-8"?>
#without the "" set you would get <?xml version=.0" encoding="utf-8"?> as it would interpret as \421
Recordtmp = Recordtmp "\n<users_provision version=\42""1\42>";
Recordtmp = Recordtmp "\n<config version=\42""1\42>";
for(i=1; i<=HeaderN; i++) # We could also use n instead of HeaderN but just incase I'm maintaining base on the initial header
Recordtmp = Recordtmp "\n <" Headarray[i] ">" Detailsarray[i] "</" Headarray[i] ">";
while ((getline < configfile) >0 )
{
Recordtmp = Recordtmp "\n <" $1 ">" $2 "</" $1 ">";
}
Recordtmp = Recordtmp "\n</config>";
Recordtmp = Recordtmp "\n</users_provision>\n";
close(configfile);
print (Recordtmp)> filetostore;
close(filetostore);
}
#}
# END { # Had to expand begin block to avoid pause issue
close(Userfile);
}
Samfig.cfg
URL=msn.com
Dealer=RealtorSales
SQRFT=3600
Taxes=6000
Asking=1,800,000
Built=July/2019
Listed=07/12/2109
MSRP=2,000,000
Kitchen=5
Baths=2.5
floors=3
Rooms=5
user1.tsv
Name StreeNum StreetName City State ZIP IDcard
Ashanti Simmons 138 Jockey Hollow Avenue Phillipsburg NJ 08865 2ZR6ZS29XXOF
Bobby Marshall 7985 E. Beech Road Flemington NJ 08822 YDMWJVLO6YWS
Marianna Quinn 8950 Main St. Moses Lake WA 98837 42IXEIGOQ0FG
Jaslyn Fuentes 9581 Lafayette Dr. Hummelstown PA 17036 NTQALYCPLE06
Cory Jordan 26 Randall Mill Street Bay City MI 48706 759YUZKTS368
Содержимое cfg2ZR6ZS29XXOF. xml
<?xml version="1.0" encoding="utf-8"?>
<users_provision version="1">
<config version="1">
<Name>Ashanti Simmons</Name>
<StreeNum>138</StreeNum>
<StreetName>Jockey Hollow Avenue</StreetName>
<City>Phillipsburg</City>
<State>NJ</State>
<ZIP>08865</ZIP>
<IDcard>2ZR6ZS29XXOF</IDcard>
<URL>msn.com</URL>
<Dealer>RealtorSales</Dealer>
<SQRFT>3600</SQRFT>
<Taxes>6000</Taxes>
<Asking>1,800,000</Asking>
<Built>July/2019</Built>
<Listed>07/12/2109</Listed>
<MSRP>2,000,000</MSRP>
<Kitchen>5</Kitchen>
<Baths>2.5</Baths>
<floors>3</floors>
<Rooms>5</Rooms>
</config>
</users_provision>
Эти улучшения можно было бы сделать.
- Читать значения FS / разделить на переменные из командной строки.
- Заменить значение по умолчанию, которое существует в файле конфигурации, только если оно не равно нулю в файле данных.