Velkommen, Gjest.

< Tilbake til oversikten | Hvem kan lese?

Linux/Mac: Endring av stor tekstfil med awk, sed eller grep

#1

HP sa for siden:

Jeg har et par database dumper på noen GB. Jeg trenger å slette en linje + siste komma på linjen før.

Fra:

  
  PRIMARY KEY (`postid`),
  KEY `userid` (`userid`),
  KEY `threadid` (`threadid`,`userid`),
  FULLTEXT KEY `title` (`title`,`pagetext`)

Til:

  
  PRIMARY KEY (`postid`),
  KEY `userid` (`userid`),
  KEY `threadid` (`threadid`,`userid`)

Det er flere linjer etter FULLTEXT-linjen. Den forekommer 2 ganger og begge skal slettes. Bruker BBEdit (Mac) nå for å endre manuelt, de andre teksteditorene bare krasjer når jeg forsøker å åpne filene.

Jeg skal ikke bruke søk etter databasene er importert, så jeg sparer rundt 30min på å importere uten.

Hatt lite Google-hell, peker i retning av awk som riktig verktøy. Noen awk-kyndige her?


#2

Einar sa for siden:

så lenge fulltextlinjen er på egen linje, kan du ikke bare gjøre grep -v FULLTEXT for å bli kvitt de linjene, med en påfølgende sedregle for å fjerne komma på den siste key-en? har du litt mer fullverdige testdata, kan jeg skrible..

awk funker jo alltid, men det er plutselig litt jobb, da. :P


#3

HP sa for siden:

Det ligger noen dumper på serveren. Å fjerne FULLTEXT-linjen er ikke noe problem, det er avsluttende komma på linjen før trøbler (mariadb/mysql vil ikke ha den).


#4

HP sa for siden:

Her er en, linjen over er ikke lik for alle jeg vil fjerne.

--
-- Table structure for table `post`
--

DROP TABLE IF EXISTS post;
/*!40101 SET @saved_cs_client = @@character_set_client /;
/
!40101 SET character_set_client = utf8 /;
CREATE TABLE post (
postid int(10) unsigned NOT NULL AUTO_INCREMENT,
threadid int(10) unsigned NOT NULL DEFAULT '0',
parentid int(10) unsigned NOT NULL DEFAULT '0',
username varchar(100) NOT NULL DEFAULT '',
userid int(10) unsigned NOT NULL DEFAULT '0',
title varchar(250) NOT NULL DEFAULT '',
dateline int(10) unsigned NOT NULL DEFAULT '0',
pagetext mediumtext,
allowsmilie smallint(6) NOT NULL DEFAULT '0',
showsignature smallint(6) NOT NULL DEFAULT '0',
ipaddress varchar(15) NOT NULL DEFAULT '',
iconid smallint(5) unsigned NOT NULL DEFAULT '0',
visible smallint(6) NOT NULL DEFAULT '0',
attach smallint(5) unsigned NOT NULL DEFAULT '0',
infraction smallint(5) unsigned NOT NULL DEFAULT '0',
reportthreadid int(10) unsigned NOT NULL DEFAULT '0',
PRIMARY KEY (postid),
KEY userid (userid),
KEY threadid (threadid,userid),
FULLTEXT KEY title (title,pagetext)
) ENGINE=MyISAM AUTO_INCREMENT=4699964 DEFAULT CHARSET=latin1;
/
!40101 SET character_set_client = @saved_cs_client */;

--
-- Dumping data for table post


#5

Einar sa for siden:

#!/bin/bash
sed -e '/FULLTEXT/d' |
sed -ne '
/ENGINE=MyISAM/!{H}
/ENGINE=MyISAM/{x; s/,[ \t]*$//; p; }
${g;p;}
'

Slapp å tenke, kunne bare tilpasse noe jeg fant - cat databasedump til det scriptet, og vips.


#6

Juste sa for siden:

Og dette er hvorfor jeg aldri skal sette mine bein borti Linux...


#7

Einar sa for siden:

Vil ikke si tekstmassasje er et egnet eksempel å trekke frem operativsystem på. Alle moderne operativsystemer lar deg peke og klikke deg intuitivt gjennom de vanlige brukerbehovene. Det HP driver med er noe helt annet, og du ville ikke fått en enklere vei med f.eks. Windows. :)


#8

Sir Limpalot sa for siden:

Jeg har scriptet i Linux (Bash) i årevis og er nå nødt for å lære meg Powershell...
Hvis du ikke er dritgod i Powershell er det litt urettferdig å rakke ned på Linux fordi du ikke er tilsvarende god i Bash, synes jeg. ;)


#9

HP sa for siden:

Den fungerer utmerket på Linux, men i MacOS får jeg følgende:

MBPr:Dumps hp$ cat test.sql | ./sans-fulltext.sh 
sed: 2: "
/ENGINE=MyISAM/!{H}
/E ...": extra characters at the end of H command

Google sier at linux har GNU sed, mens MacOS har BSD sed.

Skriptet:

#!/bin/bash
sed -e '/^\s\sFULLTEXT/d' |
sed -ne '
/ENGINE=MyISAM/!{H}
/ENGINE=MyISAM/{x; s/,[ \t]*$//; p; }
${g;p;}
'

Foreldreportalen er i en flytteprosess, denne versjonen av FP er fortsatt under utvikling. Hvis du vil svare i tråden, så kan du gjøre det her.