Portál AbcLinuxu, 11. května 2025 06:36

Dotaz: Awk - funkce, více vstupních souborů

23.12.2018 09:18 Lukáš
Awk - funkce, více vstupních souborů
Přečteno: 499×
Odpovědět | Admin
Příloha:
Dobrý den, mohl bych poprosit o pomoc s awk? Mám soubor dcout1.active a zajímají mě čísla z tabulky Input-Output in F Format z 5. a šestého sloupce z konce souboru (řádek 27945) kromě řádku začínajícího 26. Všechna čísla bych chtěl useknout za 6 desetinných míst Jak se udělá, aby se nejdřív počítalo a pak se použila funkce t? /^11 / { print t($5*180/3.141592653589) "\n" t($6*180/3.141592653589); }

Současný příkaz: /^$/ { flag=0; next; } /D Format/ { flag=0; next; } /F Format/ { flag=1; next; } /^ 9 / { print t($5) "\n" t($6); } /^10 / { print t($5) "\n" t($6); } /^11 / { print t($5*180/3.141592653589) "\n" t($6*180/3.141592653589); } /^15 / { print t($5*100) "\n" t($6*100); } /^16 / { print t($5) "\n" t($6); } /^20 / { print t($5*10) "\n" t($6*10); } /^23 / { print t($5) "\n" t($6); } /^24 / { print t($5) "\n" t($6); } function t(n, s) { s=index(n,"."); return (s ? substr(n,1,s+6) : n); }

Jak napsat více vstupních souborů? awk -f code dcout1.active dcout2.active dcout3.active..... Jde to lépe?

Proč mám špatně vyhraněnou tu oblast? Vypisují se tam i hodnoty z následující tabulky.

Děkuji moc
Nástroje: Začni sledovat (1) ?Zašle upozornění na váš email při vložení nového komentáře.

Odpovědi

23.12.2018 09:20 abcde
Rozbalit Rozbalit vše Re: Awk - funkce, více vstupních souborů
Odpovědět | | Sbalit | Link | Blokovat | Admin
Ahoj, nemůžeš dát k dispozici i ta data? Abychom si to mohli zkusit
23.12.2018 09:32 Lukáš
Rozbalit Rozbalit vše Re: Awk - funkce, více vstupních souborů
Je to ten soubor dcout1.active nahoře.
23.12.2018 10:15 Lukáš
Rozbalit Rozbalit vše Re: Awk - funkce, více vstupních souborů
Příloha:
Tady je ještě druhý
23.12.2018 10:17 Lukáš
Rozbalit Rozbalit vše Re: Awk - funkce, více vstupních souborů
Šlo by pak z každého souboru vypsat výstup - 16 čísel buď jako sloupce vedle sebe nebo jako řádky - jeden z jednoho souboru? Děkuji
23.12.2018 10:25 abcde
Rozbalit Rozbalit vše Re: Awk - funkce, více vstupních souborů
Jo, oboji jde stahnout, az budu mit chvili zkusim na to mrknout, pripadne to zkusi nekdo jiny :0)
23.12.2018 10:53 NN
Rozbalit Rozbalit vše Re: Awk - funkce, více vstupních souborů
Odpovědět | | Sbalit | Link | Blokovat | Admin
Zeptam se jinak. Ten software, ze ktereho je export,co je to? Nedalo by se to premluvit k lepsimu vystupu samotneho exportu?
23.12.2018 14:06 Lukáš
Rozbalit Rozbalit vše Re: Awk - funkce, více vstupních souborů
Je to výstup z programu PHOEBE, do toho bych nezasahoval. Vlatně mi ani nejde tak o to, že nefunguje ta oblast. Hlavně bych potřeboval ten výpočet s tím useknutím na 6 desetinných míst. a udělat to pro několik souborů najednou. Tamto si umažu.
23.12.2018 14:11 Lukáš
Rozbalit Rozbalit vše Re: Awk - funkce, více vstupních souborů
Třeba tento program přesně tu oblast vypisoval:

/^$/ { flag=0; next; } /D Format/ { flag=0; next; } /F Format/ { flag=1; next; } /^26 / { next; } flag && /^ *[0-9]/ { print t($5) "\n" t($6); } function t(n, s) { s=index(n,"."); return (s ? substr(n,1,s+6) : n); }

a to

43.685030

0.106608

0.080182

0.000675

2.734748

0.011468

0.219356

0.001769

83.864830

0.115873

2.250249

0.004792

3.936308

0.005290

7.491860

0.009210

ale potřeboval bych tam zahrnout to počítání.
23.12.2018 22:22 pavele
Rozbalit Rozbalit vše Re: Awk - funkce, více vstupních souborů
Nevím jestli to pomůže, ale já jsem zaokrouhloval nějak takto:
# promenna FS urcuje oddelovac sloupcu, v mem pripade je to ;
# promenna OFMT urcuje pocet desetinnych mist a mezery mezi cisly
echo " Aritmeticky prumer dat od $USERDATE3 $USERTIME1 do $USERDATE4 $USERTIME2" >/datalog_bin/prumer/ctiprumer.$$
awk --use-lc-numeric 'BEGIN { FS = " "; print " Merici ustredna Difuse (OS GNU/Linux with Tux Inside)" }
{ s=s+$2; s1=s1+$3; s2=s2+$4; s3=s3+$5; s4=s4+$6; s5=s5+$7; s6=s6+$8; s7=s7+$9;\
 s8=s8+$10; s9=s9+$11; s10=s10+$12; s11=s11+$13; s12=s12+$14; s13=s13+$15; s14=s14+$16; s15=s15+$17 }
END { OFMT= "%3.2f ";
 print ""
 printf("%-15s %6.2f %4s %-40s\n"," CHANNEL_0", s/NR+0.00001, "%RH ", "Prumerna_vlhkost_Skrin_1")
 printf("%-15s %6.2f %4s %-40s\n"," CHANNEL_1", s1/NR+0.00001, "°C ", "Prumerna_teplota_Skrin_1")
 printf("%-15s %6.2f %4s %-40s\n"," CHANNEL_2", s2/NR+0.00001, "     ", " ")
 printf("%-15s %6.2f %4s %-40s\n"," CHANNEL_3", s3/NR+0.00001, "     ", " ", " ")
 printf("%-15s %6.2f %4s %-40s\n"," CHANNEL_4", s4/NR+0.00001, "%RH ", "Prumerna_vlhkost_Skrin_2")
 printf("%-15s %6.2f %4s %-40s\n"," CHANNEL_5", s5/NR+0.00001, "\260C ", "Prumerna_teplota_Skrin_2")
 printf("%-15s %6.2f %4s %-40s\n"," CHANNEL_6", s6/NR+0.00001, "     ", " ")
 printf("%-15s %6.2f %4s %-40s\n"," CHANNEL_7", s7/NR+0.00001, "     ", " ")
 printf("%-15s %6.2f %4s %-40s\n"," CHANNEL_8", s8/NR+0.00001, "%RH ", "Prumerna_vlhkost_Skrin_3")
 printf("%-15s %6.2f %4s %-40s\n"," CHANNEL_9", s9/NR+0.00001, "\260C ", "Prumerna_teplota_Skrin_3")
 printf("%-15s %6.2f %4s %-40s\n"," CHANNEL_10", s10/NR+0.00001, "   ", " ")
 printf("%-15s %6.2f %4s %-40s\n"," CHANNEL_11", s11/NR+0.00001, "   ", " ")
 printf("%-15s %6.2f %4s %-40s\n"," CHANNEL_12", s12/NR+0.00001, "%RH ", "Prumerna_vlhkost_okoli")
 printf("%-15s %6.2f %4s %-40s\n"," CHANNEL_13", s13/NR+0.00001, "\260C ", "Prumerna_teplota_okoli")
 printf("%-15s %6.2f %4s %-40s\n"," CHANNEL_14", s14/NR+0.00001, "kPa ", "Prumerny_tlak_vzduchu")
 printf("%-15s %6.2f %4s %-40s\n"," CHANNEL_15", s15/NR+0.00001, "   ", " ")}' \
< /datalog_bin/prumer/doprumeru.dat.$$ >>/datalog_bin/prumer/ctiprumer.$$

Výstup je takový:
 CHANNEL_0       59,91 %RH  Prumerna_vlhkost_Skrin_1                
 CHANNEL_1       22,71  °C  Prumerna_teplota_Skrin_1                
 CHANNEL_2        0,00                                               
 CHANNEL_3        0,00                                               
 CHANNEL_4       52,60 %RH  Prumerna_vlhkost_Skrin_2                
 CHANNEL_5       23,08  `C  Prumerna_teplota_Skrin_2                
 CHANNEL_6        0,00                                               
 CHANNEL_7        0,00                                               
 CHANNEL_8       73,46 %RH  Prumerna_vlhkost_Skrin_3                
 CHANNEL_9       22,68  `C  Prumerna_teplota_Skrin_3                
 CHANNEL_10       0,00                                              
 CHANNEL_11       0,00                                              
 CHANNEL_12      42,59 %RH  Prumerna_vlhkost_okoli                  
 CHANNEL_13      21,30  `C  Prumerna_teplota_okoli                  
 CHANNEL_14      99,10 kPa  Prumerny_tlak_vzduchu                   
 CHANNEL_15       0,00
Více vstupních souborů:
hlavicka="/datalog_bin/tlak-vzduchu-html/hlavicka"
last200csv="/datalog_bin/tlak-vzduchu-html/200.csv"
paticka0="/datalog_bin/tlak-vzduchu-html/paticka0"
paticka="/datalog_bin/tlak-vzduchu-html/paticka"

{                           #Start podminky
if (hlavicka == 1)          #Pokud je promenna hlavicka=1, tiskni soubor1 (hlavicka)
  print
if (hlavicka == 2)          #Pokud je promenna hlavicka=2, uprav soubor2 (200.csv)

{                           #Start programu - uprav soubor2
split($18, datum, "[\t -]")
$18 = datum [3] "." datum [2] "." datum [1] " " datum [4]
                                                     #Vypocet relativniho tlaku vzduchu
AbsPress = $16                                        #Absolutni tlak v kPa
ElevationDifuse = "217"                               #Nadmorska vyska v m
GravConst = "9,80665"                                 #Isaac Newton
GasConst = "287,04"                                   #Merna plynova konstanta R = 287,04 J/K
AverTempDifuse = $15 + (ElevationDifuse * "0,0025")   
RelPressDifuse = AbsPress/exp(-ElevationDifuse * GravConst/(GasConst * ( "273,15" + AverTempDifuse ))) * 10* "1,0012"

format1 = " %s ""\n"
format2 = " %.2f °C ""\n"
format3 = " %.3f kPa ""\n"
format4 = " %.2f HPa ""\n"


if ($0 !~ /[a-z]/) #V datech je radek s textem, ktery musim odfiltrovat
   {
   printf "" "\n"
   printf (format1 format2 format3 format4, $18, $15, $16, RelPressDifuse "\n")
   print "" "\n"
   }
else
   {
   next
   }

}                    #Stop programu


if (hlavicka == 3)          #Pokud je promenna hlavicka=7, print tabletty1
{
print
}

{ if (hlavicka == 4)          #Pokud je promenna hlavicka=3, print paticka0
print
}

{ if (hlavicka == 5)          #Pokud je promenna hlavicka=3, print aktualnihodnoty
print 
}

{ if (hlavicka == 6)          #Pokud je promenna hlavicka=3, print paticka
print
}


}' hlavicka=1 "$hlavicka" hlavicka=2 "$last200csv" hlavicka=3 "$tabletty1" hlavicka=4 "$paticka0" hlavicka=5 "$aktualnihodnoty" hlavicka=6 "$paticka" |tee \
"$destination1" "$destination2" >/dev/null

done

25.12.2018 07:19 Lukáš
Rozbalit Rozbalit vše Re: Awk - funkce, více vstupních souborů
Mockrát děkuji

Založit nové vláknoNahoru

Tiskni Sdílej: Linkuj Jaggni to Vybrali.sme.sk Google Del.icio.us Facebook

ISSN 1214-1267, (c) 1999-2007 Stickfish s.r.o.