Ulike måter å bruke kolonnekommando på i Linux


Har du noen gang vært i en situasjon for å jobbe med CSV-filer og produsere utdata i strukturert tabellformat? Nylig jobbet jeg med datarensing på en fil som ikke er i en skikkelig struktur. Den har så mange mellomrom mellom hver kolonne, og jeg må konvertere den til CSV-format for å skyve til databasen. Etter å ha renset og opprettet utdataene i CSV-format, er utdataene mine ikke visuelt attraktive for å bekrefte dataintegriteten i CSV-filen. Dette er tiden "Kolonne"-kommandoen kommer til nytte for meg.

I følge manpage, kommandoen kolonne "kolonnelister ". Med enkle ord er kolonnen et enkelt verktøy som kan formatere utdataene dine til et kolonne-format (rader og felt) basert på strukturen til kildefilen. Kommandoen column er en del av util-linux-pakken.

Et viktig poeng å merke seg her er at column-kommandoen oppfører seg forskjellig i Debian-baserte og Rhel-baserte distroer. Årsaken er at Debian-basert distro bruker «kolonne » fra bsdmainutils i stedet for util-linux. Oppstrømsversjonen av kommandoen kolonne er nyere enn pakken bsdmainutils. Ta en titt på feilrapporten for å vite mer om dette.

dpkg -S $(which column)

For demonstrasjonsformål bruker jeg CentOS 7 og vil vise forskjellige alternativer mellom Ubuntu og CentOS 7. For å sjekke kolonne-versjonen, kjør følgende kommando. Denne kommandoen vil også vise util-linux-pakkeversjonen.

column --version  # will not work in Debian/ubuntu

Du kan også sjekke versjonen av util-linux ved å kjøre kommandoene nedenfor.

rpm -qa | grep -i util-linux   # Redhat,Centos,Fedora,Amazon Linux
dpkg -l | grep -i util-linux    # Ubuntu

Før du bruker kolonne-kommandoen, vil et godt sted å starte være man-siden og utforske alternativene.

man column

List filinnhold i tabellformat

Kommandoen kolonne kan lage en tabell ved å sende filnavnet som et argument sammen med -t-flagget. Jeg bruker /etc/passwd som inndatafil.

column -t /etc/passwd

Når du ser på bildet ovenfor, tror du kanskje at dette ikke er det vi forventet, og utgangen kan se rar ut. Ja! Du har rett. Kolonner vurderer mellomrom som standard skilletegn når du oppretter en tabell. Denne virkemåten kan overstyres ved å sende en egendefinert skilletegn.

Egendefinert Delimeter

Egendefinerte skilletegn gir deg et bredt spekter av alternativer å jobbe med. For å lage et egendefinert skilletegn, bruk -s-flagget etterfulgt av et skilletegn. Nå vil vi bruke “: ” som skilletegn for å dele /etc/passwd-filen.

column -s ":"  -t /etc/passwd

Se på bildet ovenfor hvor tabellen er pent formatert og strukturert. Fra util-linux versjon 2.23 er alternativet -s endret til ikke å være grådig.

Kjør nå den samme kommandoen i Ubuntu og resultatet vil bli grådig. Dette er fordi kommandoen kolonne (bsdmainutils) på Ubuntu vil behandle flere tilstøtende ord som ett enkelt ord.

column -s ":"  -t /etc/passwd

For å overvinne denne oppførselen, bruk -n-flagget.

column -t -s ":" -n /etc/passwd             # Only on Debian/Ubuntu

Ignorer hvite tomme linjer i filutdata

Når du har tomme linjer i inndatafilen, ignorerer kolonnekommandoen den som standard. Se inndatafilen min som er i CSV-format og jeg la til en tom linje mellom hver linje. La oss nå lage en tabell som vi gjorde før med denne inndatafilen.

column -t -s ";" dummy.txt

Fra bildet ovenfor kan du se at inndatafilen min dummy.txt har tomme linjer, og når jeg prøver å lage en tabell, ignoreres tomme linjer.

Merk: Dette er standard oppførsel for både «bsdmainutils/util-linux»-varianten av kolonne-kommandoen. Men kolonne (bsdmainutils) har muligheten til å overstyre denne virkemåten ved å sende -e-flagget.

column -e -t -s "," dummy.txt        # Only on Debian/Ubuntu

Fra bildet ovenfor kan du se at tabellen er riktig formatert og at de tomme linjene ikke ignoreres.

File Output Separator

Som standard vil to mellomrom brukes som utdataskillere. Denne oppførselen kan overstyres ved å sende -o-flagget. Du vil ikke ha et utdataseparatoralternativ tilgjengelig i kolonnen (bsdmainutils).

column -t -s "," -o "||" dummy.txt	# Only on Rhel based distro

Konverter filrader til kolonner

Ved å bruke -x flagget kan du konvertere rader til kolonner. Denne oppførselen er den samme i både rhel- og ubuntu-variantene av kolonnekommandoen. Dette er en veldig nyttig funksjon når du må ta tak i et bestemt felt gjennom kommandoen awk eller kolonne og deretter konvertere den til overskriften for CSV-filen din.

column -x fillcols.txt

Når du kjører kommandoen kolonne uten å bruke noen flagg, vil oppførselen være den samme som å sende -x-flagg.

Finn kolonnestørrelse

Kolonnen bruker en miljøvariabel ($COLUMNS) for å finne ut størrelsen på terminalen din, og basert på størrelsen, bruk echo-kommandoen, vil tabellstørrelsen vises i terminalen .

echo $COLUMNS

Ta en titt på bildet nedenfor. Til å begynne med endret jeg størrelsen på terminalen min til å ha $COLUMNS størrelsen satt til 60 og kjørte kolonnekommandoen. Igjen endret jeg størrelsen på terminalen min til å ha $COLUMNS størrelsen satt til 114 og kjørte kolonnekommandoen på nytt. Du kan se forskjellen på hvordan kolonnen skriver ut tabellen når vi endrer størrelsen på terminalen.

column -t -s ":" /etc/passwd | head 5

Det er det for denne artikkelen. Hvis du har tilbakemeldinger, vennligst gi det i kommentarfeltet.