2013-01-24 49 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的帮助(你们所有人)) –