Komentosarjan optimointi NF: n ja a for -silmukan avulla

Minulla on useita tiedostoja, joista jokaisella on erilainen sarakemäärä. Haluan muuntaa ne lisäämään ne tietokantaan.

Esimerkiksi tiedosto test01:

0001 000000000000001 john smith 45 500 0002 000000000000002 peter jackson 20 80 0003 000000000000002 robert brown 35 100 0004 000000000000007 sarah white 40 300 

Haluttu lähtöni on:

("0001","000000000000001","john smith","45","500"), ("0002","000000000000002","peter jackson","20","80"), ("0003","000000000000002","robert brown","35","100"), ("0004","000000000000007","sarah white","40","300"); 

tämän saavuttamiseksi käytän seuraavaa komentosarjaa:

cat test01 |awk -F"\t" "{print "("\"""$1""\"","\"""$2""\"","\"""$3""\"","\"""$4""\"","\"""$5""\""),"}" |sed "$ s/.$/;/" 

Ja se toimii hyvin, ongelma on, kun löydän toisen tiedoston, jolla on erilainen sarakemäärä, joten minun on muokattava komentosarjaa manuaalisesti.

Tiedän, että saan sarakemäärän ilman AWK: n muuttujaa NF, mutta miten yhdistää tämä muuttuja komentosarjan for-silmukkaan?

Kun yritän

cat test01 | awk "{for (i = 1; i <= NF; i++){print $i""\"","\"""}}" 

Saan tämän tuloksen:

0001"," 000000000000001"," john"," smith"," 45"," 500"," 0002"," 000000000000002"," peter"," jackson"," 20"," 80"," 0003"," 000000000000002"," robert"," brown"," 35"," 100"," 0004"," 000000000000007"," sarah"," white"," 40"," 300"," 

Kommentit

  • Onko alkuperäisessä tiedostossa välilehtien erottimia vai onko se vain " jotkut välilyönnit "?
  • Se on sarkaimen erotin

Vastaa

GNU: n käyttäminen sed:

$ sed -e "s/^/("/" -e "s/\t/","/g" -e "s/$/"),/" -e "$s/.$/;/" file ("0001","000000000000001","john smith","45","500"), ("0002","000000000000002","peter jackson","20","80"), ("0003","000000000000002","robert brown","35","100"), ("0004","000000000000007","sarah white","40","300"); 

-komentosarja on neljä osaa:

  1. s/^/("/ korvaa rivin alun (".
  2. s/\t/","/g korvaa välilehdet "," -välilehdillä. Tämä on bitti, joka vaatii GNU sed. Lisää muille sed -toteutuksille kirjaimellinen välilehti \t -tilan tilalle.
  3. s/$/"),/ korvaa rivin lopun "),.
  4. $s/.$/;/ korvaa pilkun rivin lopussa viimeinen rivi (vain) ;.

Kommentit

  • Suoritan komentosarjan ja se kehottaa " > " odottamaan jotain
  • @ user3333911 Minulla oli virheellisiä lainauksia aiemmasta versiosta. Korjattu nyt ja testattu.

Vastaa

Jos syötetiedosto on välilehdellä erotettu, voit kokeilla seuraavaa:

awk -F"\t" -vq=""" -vOFS="","" "$1=$1 {print "(" q $0 q ");"}" filename 

Tai upota lainausmerkit tulostustoimintoon:

awk -F"\t" -vOFS="","" "$1=$1 {print "(" "\x27" $0 "\x27" ");"}" filename 

kommentit

  • Katso pilkkuja kaikkien rivien lopussa viimeistä lukuun ottamatta …
  • Hyvä huomautus siellä @Kusalananda. Tein pikakorjauksen kuten kohdassa awk -F"\t" -vq="'" -vOFS="','" '$1=$1 {print "(" q $0 q "),"}' filename | sed '$s/,$/;/'. Onko jotain parempaa ehdotusta?
  • Ei, se on ' hyvä ratkaisu.

Vastaa

Jos haluat saavuttaa saman käyttäytymisen kuin haluat alkuperäisellä komentosarjalla, voit käyttää awk-menetelmää ”printf”. Sen avulla voidaan päästä eroon uusista viivoista, jotka ”tulostaa”. Oletan, että komentosarjasi tulisi kirjoittaa uudestaan seuraavasti:

cat test01 | awk "{for (i = 1; i <= NF; i++){printf $i""\"","\"""}; printf "\n";}" 

Vastaa

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