2017-03-02 58 views
1

我需要更新一个包含350万条记录的巨大csv文件的帮助。我需要使用另一个文件的映射值更新第3列。如何使用awk从另一个csv文件映射更新csv文件中的一列

我试图通过在映射文件中搜索模式来读取文件和更新第3列,但由于实际文件有350万,映射文件有大约100万条记录,它似乎永远在运行。

E.g.

实际文件:

 
123,123abc,456_def,456_def_ble,adsf,adsafdsa,123234,45645,435,12,42,afda,3435,wfg,34,345,sergf,5t4 
234,234abc,5435_defg,345_def_ble,3adsaff,asdfgdsa,165434,456,435,12,42,afda,3435,wfg,34,345,sergf,5t4 

映射文件:

 
456_def,24_def 
5435_defg,48_defg 

输出预计:

 
123,123abc,24_def,456_def_ble,adsf,adsafdsa,123234,45645,435,12,42,afda,3435,wfg,34,345,sergf,5t4 
234,234abc,48_defg,345_def_ble,3adsaff,asdfgdsa,165434,456,435,12,42,afda,3435,wfg,34,345,sergf,5t4 
+2

你到目前为止尝试过什么? –

+0

更新了问题。 –

回答

0

您可以使用awk此:

awk 'BEGIN{FS=OFS=","}  # Set field separator as comma 
    NR==FNR{a[$1]=$2;next} # Store the mapping file into the array a 
    {if($3 in a) $3=a[$3]} # Check if there is match, and change the column value 
    1      # Print the whole line 
    ' mapping actualfile 
+0

非常感谢,它非常完美! –

2

Awk

awk 'BEGIN{FS=OFS=","}FNR==NR{hash[$1]=$2; next}$3 in hash{$3=hash[$3]}1' mapFile actualFile 

漂亮的直线前进产生你所需要的输出。

123,123abc,24_def,456_def_ble,adsf,adsafdsa,123234,45645,435,12,42,afda,3435,wfg,34,345,sergf,5t4 
234,234abc,48_defg,345_def_ble,3adsaff,asdfgdsa,165434,456,435,12,42,afda,3435,wfg,34,345,sergf,5t4 

为了加快的东西,你可以改变locale设置使用ASCII

简单地说,使用locale C则默认为服务器的基础ASCII Unix/Linux操作系统的语言时。默认情况下,您的区域设置将被国际化并设置为UTF-8,它可以表示Unicode字符集中的每个字符以帮助显示任何世界的书写系统,目前超过110,000个独特字符,而使用ASCII则每个字符都编码为一个字节序列及其字符集不能超过128的唯一字符。所以只是做

LC_ALL=C awk 'BEGIN{FS=OFS=","}FNR==NR{hash[$1]=$2; next}$3 in hash{$3=hash[$3]}1' mapFile actualFile 
相关问题