awk - regelovergangen

Pagina: 1
Acties:

  • dineke
  • Registratie: Januari 2009
  • Laatst online: 14-09-2015
Ik heb een tekstbestand met data en wil er het een en uit filteren met 'grep' en 'awk'. Echter awk herkent niet hetzelfde aantal regels als wc:

$ wc leads.txt -->
44 1244 11520

$ awk '{print NR}' < leads.txt -->
1
2
3
4

Sterker nog, wanneer je die regels van awk afdrukt en weer wc doet blijkt 83% foetsie:

$ awk '{print $0}' < leads.txt | wc
4 202 1891

Het zou eventueel te maken kunnen hebben met het type bestand: het komt uit een .zip-file (waarschijnlijk een windows-zip) en bij het unpacken werd het binary in plaats van ascii. Ik weet niet of dat het is en hoe ik een file van binary naar ascii kan omzetten.

Alle hulp wordt toegejuicht *O*

- Dineke -

Overigens

  • planB
  • Registratie: Juli 2006
  • Laatst online: 19:52
Om regels te tellen moet je
wc -l leads.txt
typen volgens mij,

  • dineke
  • Registratie: Januari 2009
  • Laatst online: 14-09-2015
wc levert aantal newlines <tab> aantal words <tab> aantal bytes.

wc -l levert aantal newlines op. Dus hetzelfde als het eerste getal van wc.

In dit geval dus voor de duidelijkheid: voor awk 44 regels, 4 regels na. Verder 11520 bytes voor en 1891 bytes na.

  • TrailBlazer
  • Registratie: Oktober 2000
  • Laatst online: 22-01 08:08

TrailBlazer

Karnemelk FTW

doe eens file op dat bestand. Misdchien zijn de regeleindes wat vreemd en wordt er daarom vreemd op gereageerd.

  • dineke
  • Registratie: Januari 2009
  • Laatst online: 14-09-2015
file zegt alleen: 'data', wat volgens mij betekent dat hij het ook niet als text heeft herkend.

Als ik een ander filetje pak met vergelijkbare inhoud maar zonder problemen krijg ik "ASCII text, with very long lines, with CRLF line terminators".

  • u_nix_we_all
  • Registratie: Augustus 2002
  • Niet online
Als het een MS-DOS type bestand is, zijn de regeleinden anders, en zal awk niet elke regel processen. Er zijn wel tooltjes voor om dat om te zetten, zoals dos2ux of dos2unix. Ik geloof dat het ook met "tr" kan, of anders met sed.

Edit: Ik weet niet welke distro je gebruikt, maar in de debian based distro's zit dos2unix in de "tofrodos" package ( sudo apt-get install tofrodos)

[ Voor 24% gewijzigd door u_nix_we_all op 10-02-2009 11:54 ]

You don't need a parachute to go skydiving. You need a parachute to go skydiving twice.


  • benoni
  • Registratie: November 2003
  • Niet online
Daarbij, als je telkens tekst uit bestanden moet halen waarin deze met niet-interpreteerbare blokken data is afgewisseld, zou je ook het commando 'strings' kunnen gebruiken om de tekst sequenties er tussenuit te vissen.

  • riddles
  • Registratie: April 2000
  • Laatst online: 26-05-2025
Inderdaad, want als "file" zegt dat het een data bestand is, dan is er iets goed mis mee. Het is zeker geen standaard tekst bestand en er is meer mis mee dan alleen dos vs. unix line termination. Zoek de '00' bytes :)

  • dineke
  • Registratie: Januari 2009
  • Laatst online: 14-09-2015
Yes! strings lijkt het te doen.
$ strings leads.txt > leads.awk

De file verandert van 44 in 30 regels, maar het totale aantal bytes verandert niet gek. En vooral: het ziet er goed uit.

$ wc leads.awk
30 1230 11433 leads.awk
$ wc leads.txt
44 1244 11520 leads.txt

En file zegt nu inderdaad dat het ascii-text is dus strings heeft zijn werk goed gedaan. Thanks! Dat commando kende ik nog niet
Pagina: 1