2015-12-07 95 views
1

我有两个文件,一个用制表符分隔,另一个用分号分隔。这两个文件在第一列中都有一个共同的ID。一方面,我想根据公共ID在第三列中合并值。另一方面,我想用第二个文件第2列中的字符串替换第一个文件第2列中的字符串,同时考虑到Common ID。AWK合并值并替换字符串

第一个文件:

ID;String;Category; 
2;es un anuncio interesante que le puede servir para alguien;321;0;; 
3;es un anuncio de un banco que quiere presentarse;72;0;; 
4;es un anuncio de un banco que ofrece prestamos para empresas.;52;0;; 
4;es un anuncio de un banco que ofrece prestamos para empresas.;70;0;; 
5;credito pyme banamex para hacer crecer tu negocio;50;0;; 
5;credito pyme banamex para hacer crecer tu negocio;52;0;; 
5;credito pyme banamex para hacer crecer tu negocio;70;0;; 
5;credito pyme banamex para hacer crecer tu negocio;71;0;; 

第二个文件:

ID String Category; 
2 Es un anuncio interesante que le puede servir para alguien. 
3 Es un anuncio de un banco que quiere presentarse. 
4 Es un anuncio de un banco que ofrece prestamos para empresas. 
5 Credito Pyme Banamex para hacer crecer tu negocio. 

所需的输出:

ID String Category 
2 Es un anuncio interesante que le puede servir para alguien. 321 
3 Es un anuncio de un banco que quiere presentarse. 72 
4 Es un anuncio de un banco que ofrece prestamos para empresas. 52 70 
5 Credito Pyme Banamex para hacer crecer tu negocio. 50 52 70 71 

我做了什么:

awk 'BEGIN { FS=";";} NR==FNR{ CAT[$1]=CAT[$1]"\t"$3; next;}{FS="\t";textos[$1]=$2;} END{ for (ID in CAT) {print ID,textos[ID],CAT[ID];}}' fileA fileB 

我的输出:

2 Es un anuncio interesante que le puede servir para alguien. 
3 Es un anuncio de un banco que quiere presentarse. 72 
4 Es un anuncio de un banco que ofrece prestamos para empresas. 52 70 
5 Credito Pyme Banamex para hacer crecer tu negocio 50 52 70 71 
¡¡In the first line the value of the third column doesn't appear!! 
+1

我们需要任何特别的原因要受到如此多的线,这样长的输入线?我不明白为什么你不能表达你的问题,说5行输入,每行5个字段。如果你不能用简单的字段将你的例子简化成简洁的大小,我怀疑是否有很多人会费心去理解它,以便他们能够帮助你。 –

+1

@EdMorton谢谢!对于你的建议,现在更好理解了? – Polucho

+3

是的,很多,但我看到你已经接受了一个答案,所以它没有让很多专家有时间看看你的问题,并试图帮助你。 FWIW您选择的答案违反了awk的变量命名约定,在错误的地方设置了'FS'(功能错误被第一行隐藏,而不是第一行,否则效率低下),包含冗余代码,具有伪随机分号和在由某些awk运行时会产生语法错误。祝你好运! –

回答

2

您可以使用此AWK:

awk -F';' -v OFS='\t' 'FNR==NR { 
    a[$1] = a[$1] OFS $3 
    next 
} 
FNR==1 { 
    FS="\t" 
    print 
} 
$1 in a { 
    print $1, $2 a[$1] 
}' file1 file2 

输出:

ID String Category 
2 Es un anuncio interesante que le puede servir para alguien. 321 
3 Es un anuncio de un banco que quiere presentarse. 72 
4 Es un anuncio de un banco que ofrece prestamos para empresas. 52 70 
5 Credito Pyme Banamex para hacer crecer tu negocio. 50 52 70 71 
+0

我必须填写第一个文件的第二列与第二个文件的第二列。通过匹配ID! – Polucho

+0

谢谢!现在第2栏中的文字是正确的。但第一行(ID 2)未打印。 – Polucho

+0

好的,但是..它缺少第三列的值。在这种情况下,将是321 – Polucho