![]() |
|
|
google unix.com
|
|||||||
| Forum | Registrera | Forum Regler | Länkar | Album | FAQ | Medlemslista | Kalender | Söka | Dagens inlägg | Markera forum som lästa |
| 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 |
| split baserat på antalet tecken | chriss_58 | Shell-programmering och Skript | 6 | 07-06-2008 11:05 |
| Dela en fil baserat på mönster i awk, grep, sed eller perl | kumarn | Shell-programmering och Skript | 5 | 06-20-2008 11:51 |
| Dela en fil med något mönster - Split, Csplit, awk | madhunk | UNIX for Dummies Frågor & Svar | 10 | 12-17-2007 12:57 |
| utvinna en linje som bygger på radnumret | narendra.pant | Shell-programmering och Skript | 2 | 09-20-2007 06:00 |
| awk-skript för att dela upp en fil baserat på villkor | superprogrammer | Shell-programmering och Skript | 12 | 06-14-2005 04:59 |
![]() |
|
|
LinkBack | Thread Tools | Sök i denna tråd |
Omdöme:
|
Visningslägen |
|
|
|
||||
|
Split File Baserat på Radnummer Mönsterredigeraren
Hej alla.
Förlåt, jag vet att denna fråga liknar många andra, men jag kan vara att sätta ihop precis vad jag behöver. Mitt ärende är fliken delimitted och innehåller ungefär 1 miljon rader. Jag skulle vilja skicka linjerna 1,4, & 7 till en fil. Linjer 2, 5, och 8 till en andra akt. Linjer 3, 6, och 9 till en tredje fil, och sedan linje 10 till en fjärde fil. Jag vill upprepa detta villkor med samma scenario, och samma fyra filer ovan. Alla tankar om den bästa metoden? |
|
||||
|
Perl eller Python looping över en uppsättning filreferenser tycks i likhet med de flesta i en effektiv strategi. För en mer fotgängarsäkerheten lösning, en awk skriptet körs fyra gånger med olika parametrar kan vara godtagbar även om filen är stor. Har fil fyra endast innehålla vart tionde linje och sedan 11, 14 och 17 går till den första filen igen? Kod:
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 har några ganska mångsidiga alternativ, du kan dra det här helt enkelt med en lämplig csplit mönstret också. Senast redigerad av era; 09-30-2008 vid 01:56.. Motivering: csplit anmärkning |
|
||||
|
Ja, 11,14 och 17 skulle gå till den första filen igen.
Jag försöker använda ksh att fullgöra denna uppgift. Nedan är vad jag har hittills, men räkna variabel inte tycks vara att återställa till 1 efter den når 11. Även jag får utgångsenergi liknande: File_split_DC.sh [42]: 2: hittades inte. File_split_DC.sh [42]: 3: hittades inte. File_split_DC.sh [42]: 4: hittades inte. Namnet på mitt manus är "File_split_DC.sh" #! / usr / bin / ksh count \u003d 1 samtidigt läsa linje göra fallet $ count i 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)) om $ count-gt 10, därefter count \u003d 1 fi gjort <My_Test.txt exit 0 |
|
|||||
|
Kod:
> 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
Kod:
> 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 och nu fyra åtskilda filer Kod:
> 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 > |
|
||||
|
Du vill Kod:
if [ $count -gt 10 ]; then Det vore effektivare att öppna fyra fil deskriptorer och sedan bara skriva ut dem deskriptorer, vilket ungefär Perl tillvägagångssätt jag föreslog ovan. Kod:
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
Observera användningen av Skriv ut snarare än echo - Det här är ksh-specifik, men förutom att det här skriptet bör bärbara. Senast redigerad av era; 09-30-2008 vid 02:15.. Orsak: Obs print vs echo |
|
||||
|
Tack till er båda för din input. Jag vet inte vad jag gör när det gäller UNIX, så jag bara försöka att pussla godbitar tillsammans. Jag slutade med hjälp av ERA: s strategi i andra meddelanden. Det liknar vad jag redan hade tillsammans, och var vettigt. JOEYG, jag är säker på din appraoch skulle fungera lika bra, och jag tackar för din input.
|
![]() |
| Komihåglista |
| Taggar |
| uppdelat på radnumret, delade filer |
| Thread Tools | Sök i denna tråd |
| Visningslägen | Betygsätt denna tråd |
|
|