Go Back   De Unix-en Linux Forum > Top Forums > Programmeren en Shell Scripting
.
Google Site



Programmeren en Shell Scripting Post vragen over KSH, CSH, SH, Bash, Perl, PHP, sed, awk en andere shell scripts en shell scripting talen hier.

Closed Thread
English Japanese Spanish French German Portuguese Italian Powered by Powered by Google
 
Thread Tools Zoeken in deze Thread Waardering: Thread Rating: 2 votes, 4.50 average. Display Modes
  #1 (permalink)  
Old 09-30-2008
Geregistreerde gebruiker
 

Join Date: Sep 2008
Posten: 3
Split File Gebaseerd op regelnummer Patroon

Hallo allemaal.

Sorry, ik weet dat deze vraag is vergelijkbaar met vele anderen, maar ik kan lijken om samen precies wat ik nodig heb.

Mijn dossier is tabblad delimitted en bevat ongeveer 1 miljoen rijen. Ik zou willen sturen lijnen 1,4, & 7 naar een bestand. Lijnen 2, 5, & 8 naar een tweede bestand. Lijnen 3, 6, en 9 tot en derde bestand, en dan lijn 10 naar vierde bestand. Vervolgens heb ik willen herhalen deze voorwaarde het gebruik van hetzelfde scenario, en dezelfde vier bestanden hierboven. Eventuele ideeën over de beste aanpak?
Sponsored Links
  #2 (permalink)  
Old 09-30-2008
joeyg's Avatar
joeyg joeyg is offline Forum Staff  
modérateur
 

Join Date: december 2007
Locatie: Home 17-time wereld kampioen Boston Celtics
Berichten: 1.431
Cool Ik heb een start op dit

Maar, ik zal moeten sommige awk helpen (of te denken een beetje duidelijker na het eten van de lunch)


Code:
> cat big_file4
a stuff to 1 file
b stuff to 2 file
c stuff to 3 file
a stuff to 1 file
b stuff to 2 file
c stuff to 3 file
a stuff to 1 file
b stuff to 2 file
c stuff to 3 file
d stuff to 4 file
a stuff to 1 file
b stuff to 2 file
c stuff to 3 file
a stuff to 1 file
b stuff to 2 file
c stuff to 3 file
a stuff to 1 file
b stuff to 2 file
c stuff to 3 file
d stuff to 4 file

Wat ik aanvankelijk schreef niet vangen het bestand regel tekst - en waar ik denk dat ik wat hulp nodig!

Code:
> cat -n big_file4 | awk '{printf "%1s %-15s \n", substr($1,length($1),1), $2}'
1 a               
2 b               
3 c               
4 a               
5 b               
6 c               
7 a               
8 b               
9 c               
0 d               
1 a               
2 b               
3 c               
4 a               
5 b               
6 c               
7 a               
8 b               
9 c               
0 d

Want vanaf hier, mijn theorie is dat


Code:
grep "^[147] " <infile >outfile_a
grep "^[258] " <infile >outfile_b
grep "^[369] " <infile >outfile_c
grep "^[0] " <infile >outfile_d

Kan nodig zijn om voor te schrijven naar elke uitgang.
  #3 (permalink)  
Old 09-30-2008
Herder van Nutteloze Cats (On Sabbatical)
 

Join Datum: maart 2008
Locatie: / er / is / alleen / bin / sh
Berichten: 3652
Perl of Python looping over een reeks van bestandsingangen lijkt net als de meeste i efficiënte aanpak. Voor een voetganger oplossing, een awk script lopen vier keer met de verschillende parameters kunnen worden aanvaard, zelfs als het bestand is groot.

Is bestand vier alleen elke tiende regel, en vervolgens 11, 14 en 17 gaan naar het eerste bestand weer?


Code:
perl -MIO::File -ne 'BEGIN { map { $file[$_] = IO::File->new(">file$_") || die $!} 0..3; 
  @m = (0, 1, 2, 0, 1, 2, 0, 1, 2, 3);
}
$file[$m[$. % 9]]->print || die $!'

csplit heeft een aantal tamelijk veelzijdig opties, je zou kunnen trekken uit dit gewoon met een geschikte csplit patroon als goed.

Laatst gewijzigd door tijdperk; op 09.30.2008 01:56 PM.. Reden: csplit nota
  #4 (permalink)  
Old 09-30-2008
Geregistreerde gebruiker
 

Join Date: Sep 2008
Posten: 3
Ja, 11,14 en 17 zouden dan naar het eerste bestand opnieuw.

Ik probeer te gebruiken KSH om deze taak. Hieronder staat wat ik heb tot nu toe, maar de graaf variabele lijkt niet opnieuw tot 1 na bereikt 11. Ook krijg ik de output gelijk aan:

File_split_DC.sh [42]: 2: niet gevonden.
File_split_DC.sh [42]: 3: niet gevonden.
File_split_DC.sh [42]: 4: niet gevonden.

De naam van mijn script is "File_split_DC.sh"

#! / usr / bin / ksh

count \u003d 1

terwijl gelezen lijn
doen

case $ count in
1)
echo "$ line">> RT1.txt
;;
2)
echo "$ line">> RT2.txt
;;
3)
echo "$ line">> RT3.txt
;;
4)
echo "$ line">> RT1.txt
;;
5)
echo "$ line">> RT2.txt
;;
6)
echo "$ line">> RT3.txt
;;
7)
echo "$ line">> RT1.txt
;;
8)
echo "$ line">> RT2.txt
;;
9)
echo "$ line">> RT3.txt
;;
10)
echo "$ line">> RT4.txt
;;
esac
((Count + \u003d 1))

indien $ count-GT 10; vervolgens
count \u003d 1

fi
Gedaan <My_Test.txt

exit 0
  #5 (permalink)  
Old 09-30-2008
Herder van Nutteloze Cats (On Sabbatical)
 

Join Datum: maart 2008
Locatie: / er / is / alleen / bin / sh
Berichten: 3652
U wilt


Code:
if [ $count -gt 10 ]; then

Het zou efficiënter te openen vier bestand descriptoren en dan gewoon afdrukken naar deze descriptoren; dit benadert de Perl aanpak, suggereerde ik hierboven.


Code:
exec 1>rt1.txt 2>rt2.txt 3>rt3.txt 4>rt4.txt
count=1
while read line; do
  case $count in
    1|4|7) print "$line" >&1;;
    2|5|8) print "$line" >&2;;
    3|6|9) print "$line" >&3;;
    10) print "$line" >&4; count=0;;
  esac
  count=`expr $count + 1`
done <My_Test.txt

Let op het gebruik van print plaats echo - Dit is ksh-specifiek, maar andere zijn dan dat dit script moet draagbaar.

Laatst gewijzigd door tijdperk; op 09.30.2008 02:15 PM.. Reden: Opmerking print vs echo
  #6 (permalink)  
Old 09-30-2008
joeyg's Avatar
joeyg joeyg is offline Forum Staff  
modérateur
 

Join Date: december 2007
Locatie: Home 17-time wereld kampioen Boston Celtics
Berichten: 1.431
Wink hoe zit dit?


Code:
> cat -n big_file4 | awk '{printf "%1s %-100s \n", substr($1,length($1),1), $0}' | cut -c1,10- | grep "^[147]" | cut -c2- >filea
> cat -n big_file4 | awk '{printf "%1s %-100s \n", substr($1,length($1),1), $0}' | cut -c1,10- | grep "^[258]" | cut -c2- >fileb
> cat -n big_file4 | awk '{printf "%1s %-100s \n", substr($1,length($1),1), $0}' | cut -c1,10- | grep "^[369]" | cut -c2- >filec
> cat -n big_file4 | awk '{printf "%1s %-100s \n", substr($1,length($1),1), $0}' | cut -c1,10- | grep "^[0]" | cut -c2- >filed


Code:
> cat big_file4
a stuff to 1 file
b stuff to 2 file
c stuff to 3 file
a stuff to 1 file
b stuff to 2 file
c stuff to 3 file
a stuff to 1 file
b stuff to 2 file
c stuff to 3 file
d stuff to 4 file
a stuff to 1 file
b stuff to 2 file
c stuff to 3 file
a stuff to 1 file
b stuff to 2 file
c stuff to 3 file
a stuff to 1 file
b stuff to 2 file
c stuff to 3 file
d stuff to 4 file

en nu de vier gescheiden bestanden

Code:
> cat filea
a stuff to 1 file                                                                             
a stuff to 1 file                                                                             
a stuff to 1 file                                                                             
a stuff to 1 file                                                                             
a stuff to 1 file                                                                             
a stuff to 1 file                                                                             
> cat fileb
b stuff to 2 file                                                                             
b stuff to 2 file                                                                             
b stuff to 2 file                                                                             
b stuff to 2 file                                                                             
b stuff to 2 file                                                                             
b stuff to 2 file                                                                             
> cat filec
c stuff to 3 file                                                                             
c stuff to 3 file                                                                             
c stuff to 3 file                                                                             
c stuff to 3 file                                                                             
c stuff to 3 file                                                                             
c stuff to 3 file                                                                             
> cat filed
d stuff to 4 file                                                                             
d stuff to 4 file                                                                             
>

  #7 (permalink)  
Old 09-30-2008
Geregistreerde gebruiker
 

Join Date: Sep 2008
Posten: 3
Met dank aan jullie beiden voor uw input. Ik weet werkelijk niet wat ik doen als het gaat om UNIX, dus ik probeer te stukje TidBITS samen. Uiteindelijk heb ik met behulp van ERA van de aanpak in de tweede terbeschikkingstelling. Het was vergelijkbaar met wat ik had al samen, en gezond verstand. JOEYG, ik ben er zeker van dat uw aanpak zou werken als goed, en ik waardeer uw input.
Sponsored Links
Closed Thread

Bladwijzers

Labels
uitgesplitst naar regelnummer, opgesplitst naar bestanden

Thread Tools Zoeken in deze Thread
Zoeken in deze Thread:

Uitgebreid zoeken
Display Modes Beoordeel deze draad
Beoordeel deze draad:

Posting Regels
Jij mag niet Post Nieuwe threads
Jij mag niet na antwoorden
Jij mag niet post attachments
Jij mag niet bewerk uw berichten

BB code is Aan
Smilies zijn Aan
[IMG] code Aan
HTML-code is Uit
Trackbacks zijn Aan
Pingbacks zijn Aan
Refbacks zijn Uit


Meer UNIX en Linux Forum Onderwerpen Misschien vindt u Helpful
Draad Thread Starter Forum Antwoorden Last Post
gesplitst op basis van het aantal tekens chriss_58 Programmeren en Shell Scripting 6 07-06-2008 11:05
Splitsing van een bestand op basis van patronen in awk, grep, sed of perl kumarn Programmeren en Shell Scripting 5 06-20-2008 11:51
Split een bestand met geen patroon - Split, Csplit, Awk madhunk UNIX voor Dummies Questions & Answers 10 12-17-2007 12:57
winning van een lijn die gebaseerd is op regelnummer narendra.pant Programmeren en Shell Scripting 2 09-20-2007 06:00
awk script een bestand op te splitsen op basis van de voorwaarde superprogrammer Programmeren en Shell Scripting 12 06-14-2005 04:59



Alle tijden zijn GMT -4. Het is nu 03:43 PM.


Powered by: vBulletin, Copyright © 2000 - 2006, Jelsoft Enterprises Limited. Vertalingen Powered by .
vBCredits v1.4 Copyright © 2007 - 2008, PixelFX Studios
De UNIX-en Linux Forums Copyright © 1993-2010. Alle rechten Reserved.Ad Beheer door RedTyger

Content Relevante URL's door vBSEO 3.2.0