File2.csv:
我想将File1.csv中configSku,selectedSku,config_id
的内容替换为File2.csv中configSku,selectedSku,config_id
的内容。最终结果应如下所示:
以下是下载文件的链接,您可以自行尝试:
这是我尝试但仍然失败的原因:
#!/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
我该怎么做?
答案 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 documentation和the bash hackers wiki都有关于它的条目。 read
的手册页应该足够好地记录-u
选项。最后,VAR="something" command arg1 arg2
(在IFS=',' read -u -r 3
的脚本中使用)是shell脚本中的常见构造。如果您不熟悉它,我相信this answer应该提供有关它的功能的足够信息。
注意:如果你想对csv文件进行更复杂的处理,我建议使用python及其csv
包。