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:
-
s/^/("/
korvaa rivin alun("
. -
s/\t/","/g
korvaa välilehdet","
-välilehdillä. Tämä on bitti, joka vaatii GNUsed
. Lisää muillesed
-toteutuksille kirjaimellinen välilehti\t
-tilan tilalle. -
s/$/"),/
korvaa rivin lopun"),
. -
$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";}"