The UNIX and Linux Forums  

Go Back   UNIX och Linux Forum > Upp Forum > Shell-programmering och Skript
.
google unix.com


Shell-programmering och Skript Post frågor om ksh, CSH, SH, bash, PERL, PHP, sed, awk och andra skalskript och skal skriptspråk här.

Mer UNIX och Linux Forum Ämnen Du kan hitta Helpful
Tråd Thread Starter Forum Svar Senaste Inlägg
Sammanfoga rader använda awk senthil_is Shell-programmering och Skript 6 03-05-2008 12:40
Sammanfoga rader - Tuning skriptet senthil_is Shell-programmering och Skript 3 03-05-2008 03:24
sammanslagning av två rader i en fil thaduka UNIX for Dummies Frågor & Svar 6 07-11-2007 10:27
Sammanfoga rader i en Foxgard UNIX for Dummies Frågor & Svar 8 06-19-2005 07:36
Counting linjer och filer jorge.ferreira UNIX for Dummies Frågor & Svar 6 12-11-2003 11:24

Closed Thread
English Japanese Spanish French German Portuguese Italian Dutch Swedish Russian Norwegian Hungarian Hebrew Danish Bulgarian Greek Powered by Powered by Google
 
LinkBack Thread Tools Sök i denna tråd Rate Thread Visningslägen
  #1 (permalänk)  
Old 01-28-2008
Meert's Avatar
Meert Meert is offline
Registered User
  
 

Join Date: Sep 2007
Inlägg: 8
Sammanfoga filer med awk filtrering och räknar linjer

Hallå där,

Jag har ett par filer jag behöver gå samman. Jag kan göra en enkel sammanfogning av sammanfoga dem till en större fil.

Men jag behöver filtrera filen för att få ett önskat resultat.

Produktionen ser ut så här:
Kod:
TRNH 0000000010941
ORDH
OADR
OADR
ORDL
ENDT    1116399         000000003 000000001
TRLR 0000000010941 000000003 000000001
TRNH 0000000010942
ORDH
OADR
OADR
ORDL
ENDT    1116400         000000003 000000001
TRLR 0000000010942 000000003 000000001
TRNH 0000000010943
ORDH
OADR
OMSG
ORDL
ORDL
ENDT    1116399         000000004 000000001
TRLR 0000000010943 000000003 000000001
TRNH 0000000010944
ORDH
OADR
OADR
ORDL
ENDT    1116400         000000003 000000001
ORDH                                       
OADR                                       
OADR
ORDL                                       
ORDL                                       
ENDT    1116400         000000004 000000001
TRLR 0000000010944 000000007 000000002
och filtrering bör lämna den första och den sista raden med TRNH och TRLR (ge den sista TRLR samma sekvens som den första TRNH). Resten av TRNH och TRLR rader måste utelämnas.

Det slutliga TRLR ska representera mängden ORDH linjer och mängden OADR, OMSG och ORDL linjer.

Jag har inte fått till att ta bort extra TRNH och linjer TRLR ändå, det är filtret Jag har hittills:

Kod:
BEGIN {
#	 define two counters 
	ordh_cnt = 0;
	ordl_total_cnt = 0;
}

#  Start filter 

#  if line start with ORDH add 1 to counters 
$1 == "ORDH" {
	ordh_cnt++;
}

#  if line starts with TRLR, adjust line to reflect new count of ORDH in order
$1 == "TRLR" {
	printf "%s%9.9d%s\n", substr($0, 0, 31), ordh_cnt, substr($0, 39);
#	 line has been printed, next rule 
	next;
}

#  if line start with ORDL add 1 to counters 
$1 == "ORDL" {
	ordl_total_cnt++;
}

#  if line start with OADR add 1 to counters 
$1 == "OADR" {
	ordl_total_cnt++;
}

#  if line start with OMSG add 1 to counters 
$1 == "OMSG" {
	ordl_total_cnt++;
}

#  if line starts with TRLR, adjust line to reflect new total ORDL, OADR and OMSG in complete file 
$1 == "TRLR" {
	printf "%s%9.9d%s\n", substr($0, 0, 19), ordl_total_cnt, substr($0, 29);
#	 line has been printed, next rule 
	next;
}

#  Line has not changed, print normal line 
{
	print $0;
}
Nu mängden ORDH rader matas till min nya filen, så verkar fungera. Ändå mängden OADR, OMSG och ORDL linjer inte rättas till i produktionen.

Slutresultatet bör se ut så här:

Kod:
TRNH 0000000010941
ORDH
OADR
OADR
ORDL
ENDT    1116399         000000003 000000001
ORDH
OADR
OADR
ORDL
ENDT    1116400         000000003 000000001
ORDH
OADR
OMSG
ORDL
ORDL
ENDT    1116399         000000004 000000001
ORDH
OADR
OADR
ORDL
ENDT    1116400         000000003 000000001
ORDH                                       
OADR                                       
OADR
ORDL                                       
ORDL                                       
ENDT    1116400         000000004 000000001
TRLR 0000000010941 000000017 000000005
Någon hjälp skulle vara mycket uppskattat
  #2 (permalänk)  
Old 01-28-2008
radoulov's Avatar
radoulov radoulov is offline Forum Staff  
missbrukare
  
 

Join Date: Jan 2007
Ort: Варна, България / Milano, Italia
Inlägg: 2.875
Kod:
awk 'NR == 1 { trnh = $2; print }
!/^TR(NH|LR)/ { 
  if ($1 == "ORDH") 
    ordh ++ 
  if ($1 ~ /^O(ADR|MSG|RDL)/) 
    ordl ++
  print 
} END {
printf "TRLR %s %.9d %.9d\n", trnh, ordl, ordh
}' filename
  #3 (permalänk)  
Old 01-28-2008
Meert's Avatar
Meert Meert is offline
Registered User
  
 

Join Date: Sep 2007
Inlägg: 8
Tack så mycket, works like a charm!
Closed Thread

Komihåglista

Thread Tools Sök i denna tråd
Sök i denna tråd:

Avancerad sökning
Visningslägen Betygsätt denna tråd
Betygsätt denna tråd:

Utstationering Regler
Du får inte efter nya trådar
Du får inte efter svar
Du får inte skicka bilagor
Du får inte redigera dina inlägg

BB-kod är
Smilies är
[IMG] kod
HTML-koden är Av
Trackback är
Pingbacks är
Refbacks är




Alla tider är GMT -4. Klockan är nu 05:39.


Powered by: vBulletin, Copyright © 2000 - 2006, Jelsoft Enterprises Limited. Översättningar Powered by .
vBCredits v1.4 Copyright © 2007 - 2008, PixelFX Studios
UNIX och Linux Forum Innehållet upphovsrättsskyddat © 1993-2009. All Rights Reserved.

Content Relevant webbadresser från vBSEO 3.2.0