The UNIX and Linux Forums  
Hej og Velkommen fra USA til UNIX og Linux Forums! Tak for dit besøg og deltager i vores globale samfund.

Go Back   UNIX og Linux Forums > Top Forums > Shell Programmering og Scripting
.
google unix.com



Shell Programmering og Scripting Post spørgsmål om ksh, CSH, SH, Bash, Perl, PHP, SED, AWK og ANDRE shell scripts og Shell scriptsprog her.

Mere UNIX og Linux Forum Emner du måske kan finde Helpful
Tråd Thread Starter Forum Svar Last Post
skiftende tilladelse via FTP panknil Shell Programmering og Scripting 3 11-07-2007 08:08 PM
Ændre UserID og Ændre gruppe og GID deal732 Shell Programmering og Scripting 2 04-18-2007 10:09 AM
Ændre rækkefølge og efter sed venu_nbk UNIX for dummyer Spørgsmål & svar 9 07-29-2006 05:03 PM
Ændre Brugere Bab00shka Shell Programmering og Scripting 2 08-01-2003 04:44 AM
Ændre IP's Hordak UNIX for dummyer Spørgsmål & svar 2 08-03-2002 12:42 AM

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øg denne tråd Rate Thread Display Modes
  #1 (permalink)  
Old 10-04-2008
jolecanard jolecanard is offline
Registreret Bruger
  
 

Join Date: Sep 2008
Stillinger: 36
Unhappy awk ændrer mit FS!

Hello there,

Her er (en del) af den fil, jeg vil ændre. Bemærk de tre rum før "3" (kan være "2" eller "0" også).

Code:
   3 621530  1.1935E-02 631530  1.1293E+01 641530  1.1117E-02 571540  4.4419E-14
   3 581540  2.6670E-10 591540  3.8610E-09 601540  1.1016E-06 611540  3.2618E-06
   3 611541  6.5572E-07 621540  9.8307E+00 631540  3.1177E+00 641540  1.4615E+00
   3 571550  0.0000E+00 581550  8.8139E-12 591550  1.0739E-09 601550  2.5639E-07
   3 611550  1.1011E-06 621550  3.6787E-05 631550  3.4821E+00 641550  3.1855E+00
   3 641551  0.0000E+00 581560  9.4585E-13 591560  7.5358E-11 601560  1.2023E-07
   3 611560  1.7968E-07 621560  5.4237E-04 631560  3.0054E-02 641560  6.5687E+00
   3 581570  2.3926E-14 591570  9.9322E-12 601570  4.3929E-09 611570  4.6793E-07
   3 621570  5.5911E-06 631570  6.3564E-04 641570  3.2355E+00 591580  2.8608E-13
Jeg vil gerne finde nogle ID (f.eks 621530) og ændre værdien efter det.

Jeg bruger dette script:
Code:
VALUE=".........."
awk -v var="$VALUE" 'BEGIN{}
NR==FNR{a[$0]=$0; next}
{for(i=2;i<9;i+=2)if($i in a){$(i+1)=var}}
#{$1="   "$1}
{print}' ID_to_be_changed my_file
Problemet er, at det fjerner de tre rum foran i rækken, hvis det ændrer noget i rækken ... fjerne kommenterede linje løser problemet.
Men jeg ved ikke, hvordan man kan holde det samme antal mellemrum mellem rækkerne: 2 rum mellem id og følgende værdi, og 1 plads mellem en værdi og ID efter at (ovenstående script fylder alt i et enkelt rum).

Kan nogen hjælpe mig?
  #2 (permalink)  
Old 10-04-2008
vidyadhar85's Avatar
vidyadhar85 vidyadhar85 is offline Forum Staff  
Moderator (Den Tutor)
  
 

Join Date: Jun 2008
Beliggenhed: INDIEN
Indlæg: 1.390
sæt OFS \u003d "" enhver ingen af rum, du ønsker
  #3 (permalink)  
Old 10-04-2008
jolecanard jolecanard is offline
Registreret Bruger
  
 

Join Date: Sep 2008
Stillinger: 36
Jeg har allerede prøvet at ...
Problemet er så, at alle mine kolonner afstand med kun ét rum!

Jeg vil beholde den struktur:
Code:
 
"   "3" "xxxxxx"  "x.xxxxExx" "xxxxxx"  "x.xxxxExx"...
  #4 (permalink)  
Old 10-04-2008
jolecanard jolecanard is offline
Registreret Bruger
  
 

Join Date: Sep 2008
Stillinger: 36
Thumbs up

For nu, er den eneste løsning jeg har, er:

Code:
 
VALUE=".........."
awk -v var="$VALUE" 'BEGIN{FS=OFS=" "}
NR==FNR{a[$0]=$0; next}
{for(i=4;i<9;i+=2)if($i in a){$(i+1)=var}}
{for(i=4;i<9;i+=2)if($i in a){print "  ",$1,$2," "$3,$4," "$5,$6," "$7,$8," "$9;next}}
{print}' ID_to_be_changed my_file
Faktisk for par linjer, nogle værdier ikke har formatet "x.xxxxExxx", men mindre tegn (f.eks "0.0"). Derefter skal de manglende tegn er "rum" for at holde nivellering:

Code:
   2 982520  1.6134E-14 982530  1.7241E-17 982540  3.4164E-20 982550  1.2285E-24
   2 992530  1.8708E-17 992541  6.2076E-22 992540  7.5646E-20 992550  7.0917E-22
   2 162500  7.6697E-08      0  0.0000E+00      0  0.0000E+00      0  0.0000E+00
   3  10030  2.0892E-01  30060  6.0786E-04  30070  1.3046E-05  40090  1.9438E-05
   3  40100  1.1748E-04  60140  1.6964E-05 280660  0.0000E+00 290660  1.4066E-14
   3 300660  5.0403E-09 290670  7.6644E-19 300670  2.4718E-10 300680  1.1002E-12
Min løsning værker, så længe jeg ikke ændre værdier placeret på rækker med "reduceret" tegn ... (så længe intet er ændret i rækken, awk ikke re-concatenate rækken, og dermed bevares den rigtige afstand).

Også ved hjælp af alle de argumenter på print ikke er praktisk ...

Hvordan kan jeg løse disse to problemer?
  #5 (permalink)  
Old 10-04-2008
Franklin52 Franklin52 is offline Forum Staff  
Moderator
  
 

Join Date: Feb 2007
Indlæg: 4.300
Du kan bruge printf udskrive linje med et fast format, noget i retning af:

Code:
VALUE=".........."
awk -v var="$VALUE" 'BEGIN{FS=OFS=" ";fmt="%5s%7s%12s%7s%12s%7s%12s%7s%12s\n"}
NR==FNR{a[$0]=$0; next}
{for(i=4;i<9;i+=2)if($i in a){$(i+1)=var}}
{for(i=4;i<9;i+=2)if($i in a){printf(fmt,$1,$2,$3,$4,$5,$6,$7,$8,$9);next}}
{print}' ID_to_be_changed my_file
Hilsen
Closed Thread

Bogmærker

Thread Tools Søg denne tråd
Søg denne tråd:

Avanceret søgning
Display Modes Bedøm denne tråd
Bedøm denne tråd:

Udstationering Regler
Du kan ikke post nye tråde
Du kan ikke post svar
Du kan ikke post vedhæftede filer
Du kan ikke redigere dine indlæg

BB-kode er
Smilies er
[IMG] koden er
HTML-koden er Slukket
Trackbacks er
Pingbacks er
Refbacks er




Alle tidspunkter er GMT -4. Den tid er nu 01:57 AM.


Powered by: vBulletin, Copyright © 2000 - 2006, Jelsoft Enterprises Limited. Oversættelser Powered by .
vBCredits v1.4 Copyright © 2007 - 2008, PixelFX Studios
UNIX og Linux Forums Content Copyright © 1993-2009. Alle rettigheder Reserved.Ad Management ved RedTyger

Content Relevant webadresser ved vBSEO 3.2.0