2013-01-24 48 views
1

下面我有文件,因爲他們應該,並進一步下來,我到現在爲止。我認爲在我的代碼中是問題的根源:分隔符,但我無法讓它變得更好。更改文件中的分隔符

我的源文件是;作爲分隔符,而我的數據庫的文件有,作爲分隔符;此外,字符串之間「」:

類別的文件應該是這樣的:

"1","1","testcategory","testdescription" 

與各廠家的文件,像這樣:

"24","ASUS",NULL,NULL,NULL 
"23","ASROCK",NULL,NULL,NULL 
"22","ARNOVA",NULL,NULL,NULL 

我在這一刻什麼:

- category file: 
1;2;Alarmen en beveiligingen; 
2;2;Apparatuur en toebehoren; 
3;2;AUDIO; 

- manufacturers file: 
315;XTREAMER;NULL;NULL;NULL 
316;XTREMEMAC;NULL;NULL;NULL 
317;Y-CAM;NULL;NULL;NULL 
318;ZALMAN;NULL;NULL;NULL 

我試了一下使用sed;首先,在類文件:

cut -d ";" -f1 /home/arno/pixtmp/pixtmp.csv |sort | uniq >  /home/arno/pixtmp/categories_description-in.csv 
sed 's/^/;2;/g' /home/arno/pixtmp/categories_description-in.csv > /home/arno/pixtmp/categories_description-in.tmp 
sed -e "s/$/;/" /home/arno/pixtmp/categories_description-in.tmp > /home/arno/pixtmp/categories_description-in.tmp2 
awk 'BEGIN{n=1}{printf("%s%s\n",n++,$0)}' /home/arno/pixtmp/categories_description-in.tmp2 > /home/arno/pixtmp/categories_description$ 

,然後在製造商文件:

cut -d ";" -f5 /home/arno/pixtmp/pixtmp.csv |sort | uniq > /home/arno/pixtmp/manufacturers-in 
sed 's/^/;/g' /home/arno/pixtmp/manufacturers-in > /home/arno/pixtmp/manufacturers-tmp 
sed -e "s/$/;NULL;NULL;NULL/" /home/arno/pixtmp/manufacturers-tmp > /home/arno/pixtmp/manufacturers-tmp2 
awk 'BEGIN{n=1}{printf("%s%s\n",n++,$0)}' /home/arno/pixtmp/manufacturers-tmp2 > /home/arno/pixtmp/manufacturers.ok 
+0

您的輸出和輸入似乎沒有提供相同的內容;請只更改格式,以便我們知道您要做什麼。 – Rubens

+1

如果在一個字符串中有一個,或者;或「?你希望元字符在格式之間轉義嗎? – Patashu

回答

1

您試圖通過使用剪切,sed和AWK來解決這個問題。 AWK本身就足以解決您的問題。

我寫了一個AWK程序,可以處理你的兩個例子。如果NULL不是特例,並且製造商的文件是不同的格式,則需要製作兩個AWK程序,但我認爲應該清楚該如何實現。

我們在這裏所做的是告訴AWK「分隔符」是分號。然後AWK將輸入行分割爲我們的字段。我們在字段上循環,隨時打印。

#!/usr/bin/awk -f 

BEGIN { 
    FS = ";" 

    DQUOTE = "\"" 
} 

function add_quotes(s) { 
    if (s == "NULL") 
     return s 
    else 
     return DQUOTE s DQUOTE 
} 

NF > 0 { 
    # if input ended with a semicolon, last field will be empty 
    if ($NF == "") 
     NF -= 1 # subtract one from NF to forget the last field 

    if (NF > 0) 
    { 
     for (i = 1; i <= NF - 1; ++i) 
      printf("%s,", add_quotes($i)) 
     printf("%s\n", add_quotes($i)) 
    } 
} 
+0

非常感謝你..但它不是很清楚如何調用這個文件..我的意思是,我把代碼放在一個文件,chmod + x然後像./fixfile或./fixfile製造商那樣調用文件? –

+0

是的,這可以工作,也可以將它放入文件(例如'extract3_5.awk'),並用AWK顯式運行它:'awk -f extract3_5。 awk output_file.txt' – steveha

+0

非常感謝(..我停止編程時,我已經10歲了...而且編程是gwbasic ..現在我慢慢地重新開始..真的很多tnx的幫助(你們所有人)) –