如何将特定列从一个csv文件复制到另一个csv文件?

时间:2018-02-26 11:29:07

标签: bash csv

File1.csv: enter image description here

File2.csv:

enter image description here

我想将File1.csv中configSku,selectedSku,config_id的内容替换为File2.csv中configSku,selectedSku,config_id的内容。最终结果应如下所示:

enter image description here

以下是下载文件的链接,您可以自行尝试:

  1. File1.csv:https://www.dropbox.com/s/2o12qjzqlcgotxr/file1.csv?dl=0
  2. File2.csv:https://www.dropbox.com/s/331lpqlvaaoljil/file2.csv?dl=0
  3. 这是我尝试但仍然失败的原因:

    #!/bin/bash
    
    INPUT=/tmp/file2.csv
    OLDIFS=$IFS
    IFS=,
    
    [ ! -f $INPUT ] && { echo "$INPUT file not found"; exit 99; }
    echo "no,my_account,form_token,fingerprint,configSku,selectedSku,config_id,address1,item_title" > /tmp/temp.csv
    while read item_title configSku selectedSku config_id
    do
        cat /tmp/file1.csv | 
        awk -F ',' -v item_title="$item_title" \
        -v configSku="$configSku" \
        -v selectedSku="$selectedSku" \
        -v config_id="$config_id" \
        -v OFS=',' 'NR>1{$5=configSku; $6=selectedSku; $7=config_id; $9=item_title; print}' >> /tmp/temp.csv
    done < <(tail -n +2 "$INPUT")
    IFS=$OLDIFS
    

    我该怎么做?

1 个答案:

答案 0 :(得分:0)

原始脚本中的主要问题是您一次只读取一行文件(/tmp/file2.csv),并且对于每一行,您的解析并打印整个其他文件(/tmp/file1.csv

以下是如何在bash中合并两个csv文件的示例:

#!/bin/bash

# Open both files in "reading mode"
exec 3<"$1"
exec 4<"$2"

# Read(/discard) the header line in both csv files
read -r -u 3
read -r -u 4

# Print the new header line
printf "your,own,header,line\n"

# Read both files one line at a time and print the merged result
while true; do
    IFS="," read -r -u 3 your own || break
    IFS="," read -r -u 4 header line
    printf "%s,%s,%s,%s\n" "$your" "$own" "$header" "$line"
done

exec 3<&-
exec 4<&-

假设您将上面的脚本保存在“merge_csv.sh”中,您可以像这样使用它:

$ bash merge_csv.sh /tmp/file1.csv /tmp/file2.csv > /tmp/temp.csv

请务必修改脚本以满足您的需求(我没有使用您在问题中提供的标题)。

如果您不熟悉exec命令,the tldp documentationthe bash hackers wiki都有关于它的条目。 read的手册页应该足够好地记录-u选项。最后,VAR="something" command arg1 arg2(在IFS=',' read -u -r 3的脚本中使用)是shell脚本中的常见构造。如果您不熟悉它,我相信this answer应该提供有关它的功能的足够信息。

注意:如果你想对csv文件进行更复杂的处理,我建议使用python及其csv包。