komm

komm
Originalförfattare Lee E. McMahon
Utvecklare AT&T Bell Laboratories , Richard Stallman , David MacKenzie
Initial release november 1973 ; 49 år sedan ( 1973-11 )
Skrivet i C
Operativ system Unix , Unix-liknande , Plan 9 , Inferno
Plattform Cross-plattform
Typ Kommando
Licens
coreutils : GPLv3+ Plan 9: MIT-licens

Kommandot comm i Unix -familjen av datoroperativsystem är ett verktyg som används för att jämföra två filer för gemensamma och distinkta linjer. comm anges i POSIX -standarden. Det har varit allmänt tillgängligt på Unix-liknande operativsystem sedan mitten till slutet av 1980-talet.

Historia

Skrivet av Lee E. McMahon , comm dök först upp i version 4 Unix .

Versionen av comm som finns i GNU coreutils skrevs av Richard Stallman och David MacKenzie.

Användande

comm läser två filer som indata, betraktade som textrader. comm matar ut en fil, som innehåller tre kolumner. De två första kolumnerna innehåller rader som är unika för den första respektive andra filen. Den sista kolumnen innehåller linjer som är gemensamma för båda. Detta liknar funktionellt diff .

Kolumner särskiljs vanligtvis med tecknet <tab> . Om indatafilerna innehåller rader som börjar med separatortecknet kan utdatakolumnerna bli tvetydiga.

För effektivitetens skull förväntar sig standardimplementeringar av comm att båda indatafilerna sekvenseras i samma radsorteringsordning, sorterade lexikalt. Kommandot sort (Unix) kan användas för detta ändamål.

Comm - algoritmen använder sig av sorteringssekvensen för det aktuella språket . Om raderna i filerna inte båda är sorterade i enlighet med den aktuella lokalen är resultatet odefinierat.

Returkod

Till skillnad från diff har returkoden från comm ingen logisk betydelse när det gäller förhållandet mellan de två filerna. En returkod på 0 indikerar framgång, en returkod >0 indikerar att ett fel inträffade under bearbetningen.

Exempel












 $  cat foo  äpple banan  aubergine  $  cat  bar  äpple  banan  banan  zucchini  $  comm foo bar  äpple  banan  banan  aubergine  zucchini 

Detta visar att båda filerna har en banan, men bara baren har en andra banan.

Mer detaljerat har utdatafilen det utseende som följer. Observera att kolumnen tolkas av antalet inledande tabbtecken. \t representerar ett tabbtecken och \n representerar en nyrad ( Escape-tecken#Programmering och dataformat ) .

0 1 2 3 4 5 6 7 8 9
0 \t \t a sid sid l e \n
1 \t \t b a n a n a \n
2 \t b a n a n a \n
3 e g g sid l a n t \n
4 \t z u c c h i n i \n

Jämförelse med diff

Generellt sett är diff ett kraftfullare verktyg än comm . Den enklare comm är bäst lämpad för användning i skript.

Den primära skillnaden mellan comm och diff är att comm förkastar information om ordningen på raderna före sortering.

En mindre skillnad mellan comm och diff är att comm inte kommer att försöka indikera att en rad har "ändrats" mellan de två filerna; linjer visas antingen i kolumnerna "från fil #1", "från fil #2" eller "i båda". Detta kan vara användbart om man vill att två rader ska betraktas som olika även om de bara har subtila skillnader.

Andra alternativ

comm har kommandoradsalternativ för att undertrycka någon av de tre kolumnerna. Detta är användbart för skript.

Det finns också ett alternativ att läsa en fil (men inte båda) från standardinmatning.

Gränser

Upp till en hel rad måste buffras från varje indatafil under linjejämförelse, innan nästa utdatarad skrivs.

Vissa implementeringar läser rader med funktionen readlinebuffer() som inte sätter några radlängdsgränser om systemminnet räcker till.

Andra implementeringar läser rader med funktionen fgets () . Denna funktion kräver en fast buffert. För dessa implementeringar är bufferten ofta dimensionerad enligt POSIX- makrot LINE_MAX .

Se även

externa länkar