Awk: n käyttäminen toisen sarakkeen ja muun tekstin tulostamiseen #

Minulla on tällaisia rivejä määritystiedostoissani,

bindsym $mod+F2 exec gnome-terminal #Open terminal bindsym $mod+p exec command /some/path" #Popup Dictionary bindsym $mod+Mod1+l exec --no-startup-id /some/path/command #Dmenu for my books collection bindsym Mod1+Control+b exec rxvt -e nnn #nnn file browser 

Haluan awk poistaa toisen sarakkeen ja asiat, jotka ovat # jälkeen. Käytän awk -tunnusta

awk "/bindsym/{print $2}" filename 

En ole kuitenkaan varma, kuinka saada teksti #.
Ensisijainen lähtö on, avaimet ja sitten kommenttiteksti

$mod+F2 Open terminal 

Vastaus

$ awk -v OFS="\t" "/^bindsym/ { key = $2; sub(".*#", ""); print key, $0 }" file $mod+F2 Open terminal $mod+p Popup Dictionary $mod+Mod1+l Dmenu for my books collection Mod1+Control+b nnn file browser 

Tämä käyttää awk purkamaan jokaisen rivin toisen kentän ensin alkaen bindsym muuttujaan key. Sitten se poistaa kaiken riviin # asti ja tulostaa key ja mitä rivillä on jäljellä välilehdellä erotin.

Vaihtoehtoinen lähdön muotoilu:

$ awk "/^bindsym/ { key = $2; sub(".*#", ""); printf("%-20s\t%-20s\n", key, $0) }" file $mod+F2 Open terminal $mod+p Popup Dictionary $mod+Mod1+l Dmenu for my books collection Mod1+Control+b nnn file browser 

Logiikka on sama, mutta ulostulo varaa 20 merkkiä molemmille ( vasemmalle perustellut) kentät ja laittaa välilehden niiden väliin (hyvästä syystä).

Vastaa

match() GNU-funktio awk vastaamaan osaa # rivin loppuun

awk "/bindsym/ && match($0,/#(.+)$/,arr){print $2, arr[1]}" filep 

Funktio match() täyttää kolmannen argumentin mukaisen taulukon toisen argumentin vastaavalla kaavalla. .

missä tahansa POSIXissa awk, match(): n kolmas argumentti ei ole tuettu , mutta pari erikoismuuttujaa RSTART ja RLENGTH, jotka merkitsevät vastaavan ryhmän alku ja pituus . Käytämme nykyisen rivin substr() -funktiota vastaavan merkkijonon saamiseksi

awk "/bindsym/ && match($0,/#(.+)$/){print $2, substr($0,RSTART+1,RLENGTH)}" file 

Tulostuksen kauniiseen tulostamiseen , voit joko käyttää printf() -toimintoa kuten toisessa vastauksessa.

Vastaa

Tämä on hyvin helppo tehdä tiedostossa sed; koska tietosi eivät ole oikeastaan kenttäkeskeisiä Awk, niistä ei ole valtavaa hyötyä:

sed "s/^[^ ]* //;s/ .*#//" inputfile 

Käännös:

s/^[^ ]* // 

Poista kaikki merkit ensimmäiseen välimerkkiin asti.

s/ .*#// 

Poista kaikki ensimmäisestä (jäljellä olevasta) välilyönnistä, rivin viimeiseen # -merkkiin asti.

Vastaa

Step1: count=`awk "{print NR}"|sed -n "$p" filename` Step2:for ((i=1;i<=$count;i++)); do awk -v i="$i" "NR==i && $0 ~ /^bindsym/{print $2}" filename; sed -n ""$i"s/.*#//p" filename; done| sed "N;s/\n/ /g" output for ((i=1;i<=$count;i++)); do awk -v i="$i" "NR==i && $0 ~ /^bindsym/{print $2}" filename; sed -n ""$i"s/.*#//p" filename; done| sed "N;s/\n/ /g" $mod+F2 Open terminal $mod+p Popup Dictionary $mod+Mod1+l Dmenu for my books collection Mod1+Control+b nnn file browser 

Kommentit

  • I ' m olettaen, että rivissä voi olla enemmän kuin neljä riviä syötetiedosto. Ei ole selvää, mitä ensimmäinen askel tekisi, paitsi tulostaa rivinumero päätelaitteessa.
  • Koodin korjaaminen
  • Koodin korjaaminen

Vastaa

Sähköpostiosoitettasi ei julkaista. Pakolliset kentät on merkitty *