script in unix inhoud 2 bestanden samenvoegen

Pagina: 1
Acties:

  • Hephaistus
  • Registratie: September 2003
  • Laatst online: 23-06-2025
ik ben tamelijk noob en ben maar net bezig met het te leren,
maar bestaat er een command met als argumenten 2 files, die er voor zorgt dat de inhoud van deze 2 files wordt samengevoegd.

vb:
code:
1
2
3
cat script1
rode boze wolf
het blauwe konijn


code:
1
2
3
cat script2
is dood
huppelt rond in het bos


en dat je als resultaat krijgt:

code:
1
2
3
cat script3
rode boze wolf is dood
het blauwe konijn huppelt rond in het bos


misschien iets in deze zin:
code:
1
XXX script1 script2 > script3



of ben ik nu volledig verkeerd bezig

[ Voor 7% gewijzigd door Hephaistus op 19-11-2003 00:20 ]


  • Macros
  • Registratie: Februari 2000
  • Laatst online: 17-01 08:36

Macros

I'm watching...

Hoe je het moet doen zodat alles op dezelfde regel komt weet ik niet (heb ik nooit nodig). Maar na elkaar is heel makkelijk.
code:
1
cat file1 >> file2

Dat zorgt ervoor dat file1 aan het einde van file2 wordt gezet.

"Beauty is the ultimate defence against complexity." David Gelernter


  • Hephaistus
  • Registratie: September 2003
  • Laatst online: 23-06-2025
Macros schreef op 19 november 2003 @ 00:10:
Hoe je het moet doen zodat alles op dezelfde regel komt weet ik niet (heb ik nooit nodig). Maar na elkaar is heel makkelijk.
code:
1
cat file1 >> file2

Dat zorgt ervoor dat file1 aan het einde van file2 wordt gezet.
ja dit weet ik ook, maar dit is niet de bedoeling, ik hier twee lijsten die in verband staan met elkaar ik heb die twe lijsten al zodanig met vi of ex bewerkt, en moet nu alleen de ene lijst voor de andere kunnen zetten naast elkaar.
ik weet dat er zoiest bestaat als velden , een soort van kolomen maar ik ken deze niet of weet niet hoe ze te gebruiken.

  • Hephaistus
  • Registratie: September 2003
  • Laatst online: 23-06-2025
offtopic/ hoe zorg je er voor dat de code in zo'n wit vakje staat.

edit/ sorry was wat lui heb niet de moeite gedaan om het op te zoeken heb het nu wel al gevonden :)

[ Voor 47% gewijzigd door Hephaistus op 19-11-2003 00:16 ]


  • tomato
  • Registratie: November 1999
  • Niet online
Hmm, misschien moet je even wachten op iemand met iets meer dan de gebrekkige shell kennis die ik heb.

Maar dit doet het in ieder geval al bijna (Bash, in de C shell is een for loop ietsjes anders):

code:
1
2
3
for n in $(seq 1 `cat een | wc -l`);
   do (tail +$n een | head -1; tail +$n twee | head -1) >> drie;
done;


(merged files 'een' en 'twee' in file 'drie'.)

Behalve dat het nog een newline tussen de twee zet, maar dat is niet zo moeilijk op te lossen.

Afgezien hiervan is het natuurlijk nog steeds een }:O oplossing, die vast en zeker door iemand wordt overtroffen als je even geduld hebt ;)

[ Voor 6% gewijzigd door tomato op 19-11-2003 00:45 ]


  • Soultaker
  • Registratie: September 2000
  • Laatst online: 00:46
Een Perl-scriptje doet 't wel:
Perl:
1
2
3
4
5
6
7
8
9
#!/usr/bin/perl
($file1, $file2) = @ARGV;
open(FILE1, $file1);
open(FILE2, $file2);
while(($line1 = <FILE1>) && ($line2 = <FILE2>))     
{
        chomp($line1);
        print $line1, $line2;
}

Als je nog een spatie na de oorspronkelijke eerste regel wilt hebben (zoals in je voorbeeld) moet je de print-regel even aanpassen.

  • tomato
  • Registratie: November 1999
  • Niet online
Ja, maar Perl.... da's niet eerlijk :P

Na even nadenken: misschien heb je iets aan `sdiff` als je gelukt hebt met je content

Na even zoeken: kijk eens naar `paste`


Conclusie: voor het beste resultaat kun je het best eerst zoeken, dan Perl gebruiken, dan nadenken en dan pas beginnen met typen :D

[ Voor 13% gewijzigd door tomato op 19-11-2003 00:58 ]


  • PeterB
  • Registratie: Juli 2002
  • Laatst online: 12-04-2025
En anders vind je op programmersheaven een C programmaatje wat het ook doet :) . Even googelen naar http://www.google.nl/sear...on+text+files+in+unix&lr= (eerste resultaat)

  • Vae Victis
  • Registratie: April 2001
  • Laatst online: 00:02

Vae Victis

Dark Lord of the Sith

Soultaker schreef op 19 november 2003 @ 00:53:
Een Perl-scriptje doet 't wel:
Perl:
1
2
3
4
5
6
7
8
9
#!/usr/bin/perl
($file1, $file2) = @ARGV;
open(FILE1, $file1);
open(FILE2, $file2);
while(($line1 = <FILE1>) && ($line2 = <FILE2>))     
{
        chomp($line1);
        print $line1, $line2;
}

Als je nog een spatie na de oorspronkelijke eerste regel wilt hebben (zoals in je voorbeeld) moet je de print-regel even aanpassen.
Close dan wel even je files he ;)
code:
1
2
close(FILE1);
close(FILE2);

^^dat onderaan script is wel zo netjes.

  • Soultaker
  • Registratie: September 2000
  • Laatst online: 00:46
Vae Victis schreef op 19 november 2003 @ 01:14:
Close dan wel even je files he ;)
code:
1
2
close(FILE1);
close(FILE2);

^^dat onderaan script is wel zo netjes.
Nee, dat heb ik bewust weggelaten. Die file descriptors worden toch wel afgesloten, dus is het onnodig om ze zelf net voor het einde af te sluiten.

Overigens geeft tomato een betere oplossing; gewoon standaardutillities gebruiken is altijd goed.

[ Voor 12% gewijzigd door Soultaker op 19-11-2003 01:55 ]


  • whoami
  • Registratie: December 2000
  • Laatst online: 23:31
OS specifieke scripts horen niet thuis in P&W, maar in WOS of NOS, afhankelijk van het OS.

P&W -> NOS

https://fgheysels.github.io/


  • Wilke
  • Registratie: December 2000
  • Laatst online: 07:50
Macros schreef op 19 november 2003 @ 00:10:
Hoe je het moet doen zodat alles op dezelfde regel komt weet ik niet (heb ik nooit nodig). Maar na elkaar is heel makkelijk.
code:
1
cat file1 >> file2

Dat zorgt ervoor dat file1 aan het einde van file2 wordt gezet.
Als je twee files wilt samenvoegen en het resultaat in een derde zetten, dan eenvoudig:

cat file1 file2 > file3.

Maar wat jij wilt is idd wat ingewikkelder, maar uiteraard mogelijk met de standaard UNIX tooltjes. Zoals tomato al post:

code:
1
2
3
4
for n in $(seq 1 `cat een | wc -l`); do
  echo -n `tail +$n een | head -1` >> drie
  echo `tail +$n twee | head -1` >> drie
done;


Niet getest, maar deze zou het zonder de newlines tussen de regels uit een en twee moeten doen (als ik geen domme tik- of denkfouten heb gemaakt anyway).

Overigens zou ik deze oplossing niet gebruiken als het om lange bestanden gaat (bedenk zelf maar waarom :) ).

  • Cyril
  • Registratie: Juli 2000
  • Laatst online: 20-02 14:38

Cyril

it's all in my mind

Dit kan toch veel makkelijker met 'paste' :?
code:
1
paste file1 file2 > file3

Real Men don't make backups. They upload it via ftp and let the world mirror it. -Linus Torvalds


  • Hephaistus
  • Registratie: September 2003
  • Laatst online: 23-06-2025
Wilke , zou ik mogen vragen wat die seq betekent.

code:
1
seq: command not found


:)

[ Voor 36% gewijzigd door Hephaistus op 19-11-2003 23:59 ]


  • pinball
  • Registratie: Oktober 1999
  • Niet online

pinball

Electric Monk

seq = sequence, geeft reeksen terug op commando

code:
1
2
3
4
5
6
pinball@dimple:~$ seq 1 5
1
2
3
4
5

Whenever you find that you are on the side of the majority, it is time to reform.


  • blaataaps
  • Registratie: Juli 2001
  • Niet online
'jot' is in ieder geval op een bsd-systemen een vergelijkbaar programma, misschien dat die wel al geinstalleerd is, je vermeldt namelijk niet welke unix het over gaat in de topictitel :)

  • Wilke
  • Registratie: December 2000
  • Laatst online: 07:50
Cyril schreef op 19 november 2003 @ 15:11:
Dit kan toch veel makkelijker met 'paste' :?
code:
1
paste file1 file2 > file3
Je gaat door voor de wasmachine 8)7

Natuurlijk gaat dat veel makkelijker met paste.

Dohhhh!!!


Overigens: 'seq' betekent 'sequence', en dat levert een rijtje getallen.

Bv. 'seq 5 10' levert '5 6 7 8 9 10' op. Maar zoals Cyril opmerkt: je kunt dit nog 10 keer zo makkelijk met het commando 'paste' doen. Kijk maar eens in 'man paste' hoe het precies werkt.
Pagina: 1