Unix 从其他csv文件替换一个csv文件中的列

Unix 从其他csv文件替换一个csv文件中的列,unix,join,sed,awk,Unix,Join,Sed,Awk,我有一个csv文件,其中包含以下数据。(,分开) 现在我有了其他映射csv文件,如下所示 D1,D2 1,X 5,Y 在这里,我想在第二个csv文件中找到映射,并在第一个csv文件中更新其值 预期输出(如果我想根据第二个映射文件中的两条记录更新第一个csv文件中的C3) 使用GNU时: sed '1d;s%^%/^%;s%,%/s/^([^,]+,[^,]+,)[^,]+/\\1%;s%$%/%' file2 | sed -rf- file1 第一部分将第二个文件转换为可应用于file1的s

我有一个csv文件,其中包含以下数据。(,分开)

现在我有了其他映射csv文件,如下所示

D1,D2
1,X
5,Y
在这里,我想在第二个csv文件中找到映射,并在第一个csv文件中更新其值

预期输出(如果我想根据第二个映射文件中的两条记录更新第一个csv文件中的C3)

使用GNU时:

sed '1d;s%^%/^%;s%,%/s/^([^,]+,[^,]+,)[^,]+/\\1%;s%$%/%' file2 | sed -rf- file1
第一部分将第二个文件转换为可应用于file1的sed脚本。

这可能适用于您(GNU-sed):


这里有一种使用
awk
的方法。运行方式如下:

awk -f script.awk mapping data
script.awk的内容
: 开始{ FS=OFS=“,” }

结果:

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

使用pandas将PATID值替换为UUID值

-- 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
--替换.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
然后呢?祝你好运
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
-- 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
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