|
|
|
|
Google Site
|
|||||||
| Forums | Registreer | Blog | Man Pages | Forum Regels | Links | Albums | Veelgestelde vragen | Gebruikers | Kalender | Zoeken | Today's Posts | Markeer forums als gelezen |
| Programmeren en Shell Scripting Post vragen over KSH, CSH, SH, Bash, Perl, PHP, sed, awk en andere shell scripts en shell scripting talen hier. |
![]() |
|
|
Thread Tools | Zoeken in deze Thread |
Waardering:
|
Display Modes |
|
|||
|
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 | ||
|
|
|
|||
|
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 |
|
|||
|
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 |
|
|||
|
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 |
|
||||
|
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 > |
|
|||
|
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 | ||
|
|
![]() |
| Bladwijzers |
| Labels |
| uitgesplitst naar regelnummer, opgesplitst naar bestanden |
| Thread Tools | Zoeken in deze Thread |
| Display Modes | Beoordeel deze draad |
|
|
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 |