2013-02-08 133 views
0

我有一個csv文件,其中包含以下數據。 (,分隔)從其他csv文件替換一個csv文件中的列

C1,C2,C3,C4 
1,2,3,4 
5,6,7,8 

現在我有其他的映射csv文件,如下

D1,D2 
1,X 
5,Y 

在這裏,我想找到第二csv文件映射和更新其在第一個CSV文件中值。

期望輸出(如果我想更新第一個CSV文件C3針對第二映射文件中的兩個記錄)

C1,C2,C3,C4 
1,2,X,4 
5,6,Y,8 
+1

和http://whatHaveYouTried.com?祝你好運。 – shellter

回答

0

試試這個:

awk -F, 'NR==FNR{if(NR>1)k[$1]=$2;next}FNR==1{print}FNR>1&&$1 in k{$3=k[$1];print}' OFS="," two.csv one.csv 

與您的數據測試:

kent$ head one.csv two.csv 
==> one.csv <== 
C1,C2,C3,C4 
1,2,3,4 
5,6,7,8 

==> two.csv <== 
D1,D2 
1,X 
5,Y 

kent$ awk -F, 'NR==FNR{if(NR>1)k[$1]=$2;next}FNR==1{print}FNR>1&&$1 in k{$3=k[$1];print}' OFS="," two.csv one.csv 
C1,C2,C3,C4 
1,2,X,4 
5,6,Y,8 
+0

嗨,肯特,謝謝。這工作完美。如果我在第一個csv文件中有更多的行與映射不匹配,並且我還想打印這些行,該怎麼辦? – user2053345

0

使用GNU sed:

sed '1d;s%^%/^%;s%,%/s/^([^,]+,[^,]+,)[^,]+/\\1%;s%$%/%' file2 | sed -rf- file1 

第一部分將第二個文件轉換爲可應用於file1的sed腳本。

0

這可能爲你工作(GNU SED):

sed -r 's|^([^,]*,)(.*)|/^\1/s/[^,]+/\2/3|' file2 | sed -rf - file1 
0

下面是使用awk的一種方式。運行,如:中script.awk

awk -f script.awk mapping data 

內容: BEGIN { FS = OFS = 「」 }

NR==1 { 
    next 
} 

FNR==NR { 
    a[$1]=$2 
    next 
} 

FNR>1 { 
    $3 = a[$1] 
}1 

結果:

C1,C2,C3,C4 
1,2,X,4 
5,6,Y,8 

另外,這裏是一個班輪:

awk -F, 'NR==1 { next } FNR==NR { a[$1]=$2; next } FNR>1 { $3 = a[$1] }1' OFS="," mapping data 
0

利用大熊貓的UUID更換PATID值的值

-- a.csv 
PATID, ADMIT_DATE, ENC_TYPE 
pat_1,2011-01-01, AV 
pat_2,2012-01-01, IP 
pat_3,2013-01-01, EI 


-- b.csv 
PATID,UUID 
pat_1, uuid_xyz 
pat_2, uuid_123 
pat_3, uuid_abc 

- replace.py

import pandas as pd 

source_file = 'a.csv' 
linkage_file = 'b.csv' 
out_file = 'c.csv' 


def get_linked_frame(source_file, linkage_file): 
    df_source = pd.read_csv(source_file, sep=',', 
          dtype=object, 
          skipinitialspace=True, 
          ) 
    df_linkage = pd.read_csv(linkage_file, sep=',', 
          dtype=object, 
          skipinitialspace=True, 
          ) 
    df = pd.merge(df_source, df_linkage, on='PATID') 
    print("Source frame: \n{}".format(df_source)) 
    df['PATID'] = df['UUID'] 
    df.drop('UUID', axis=1, inplace=True) 
    return df 


df = get_linked_frame(source_file, linkage_file) 
df.to_csv(out_file, sep='\t', index=False) 
print("Output frame: \n{}".format(df)) 

-- c.csv 
PATID ADMIT_DATE ENC_TYPE 
uuid_xyz 2011-01-01 AV 
uuid_123 2012-01-01 IP 
uuid_abc 2013-01-01 EI