我有两个xlsxfile,它们不同,但只有一个共同点:日期。我必须转换为csv并将它们合并在一起。
file1
01/01/2013;horse;penguin
02/01/2013;cat;dog
03/01/2013;frog;whale
04/01/2013;mouse;bird
[...]
until nowadays, may 2017在书写这个样本时,没有动物受到伤害。
file2
14/02/2013;banana;cherry
15/02/2013;apple;mango
16/02/2013;orange;strawberry
[...]
until nowadays, may 2017--这是我想要达到的结果:,但是日期是划时代的(在这里,我把它们留在这里,而不是划时代,这样您就可以阅读它们)。
01/01/2013;horse;penguin
02/01/2013;cat;dog
03/01/2013;frog;whale
04/01/2013;mouse;bird
[...]
13/02/2013;fish;elephant
14/02/2013;bear;owl;banana;cherry
15/02/2013;monkey;bat;apple;mango
[...]下面是我做的脚本。
1) the dates needs to be epoch
2) the sheet2 does not contain the date, the date is printed in the final file for both and I use the date from sheet1
#!/bin/bash
# VARS #
XLSX=$1
SHEET1="sheet1"
SHEET2="sheet2"
P_PATH=/tmp/extract
EXTRACTCSV=$P_PATH/extract.csv
TMP_CSV=$P_PATH/temp.csv
CSV_SPLIT=$P_PATH/processed.csv
CSV_FINAL=$P_PATH/${XLSX}.csv
# START #
[ -d $P_PATH ] || mkdir -p $P_PATH
rm -rfv $P_PATH/*
########################
# ssconvert on sheet 1 #
########################
ssconvert --export-type=Gnumeric_stf:stf_assistant -O 'sheet='$SHEET1' separator=; format=automatic eol=unix' ${XLSX} ${EXTRACTCSV}"."${SHEET1}
if [ $? -gt 0 ]; then
echo "Ssconvert on $SHEET1 failed. Exiting."
exit
fi
########################
# ssconvert on sheet 2 #
########################
ssconvert --export-type=Gnumeric_stf:stf_assistant -O 'sheet='$SHEET2' separator=; format=automatic eol=unix' ${XLSX} ${EXTRACTCSV}"."${SHEET2}
if [ $? -gt 0 ]; then
echo "Ssconvert on $SHEET2 failed. Exiting."
exit
fi
######################
# Processing SHEET 1 #
######################
cat ${EXTRACTCSV}"."${SHEET1} | awk -F';' '{print $1";"$2";"$6}' > ${TMP_CSV}"."${SHEET1}
# Modify to EPOCH #
while read line; do
colDate=$(echo $line | awk -F';' '{print $1}')
colB=$(echo $line | awk -F';' '{print $2}' )
colF=$(echo $line | awk -F';' '{print $3}' )
# Skip when date not set
if [ -z ${colDate} ]; then
continue
fi
epoch_date=$(date +%s -ud ${colDate})
echo "${epoch_date};${colB};${colF}" >> ${CSV_SPLIT}.${SHEET1}
done <${TMP_CSV}"."${SHEET1}
######################
# Processing SHEET 2 #
######################
cat ${EXTRACTCSV}"."${SHEET2} | awk -F';' '{print $12";"$14";"$17}' > ${CSV_SPLIT}.${SHEET2}
##########################
# Merge the csv together #
##########################
paste -d ';' ${CSV_SPLIT}.${SHEET1} ${CSV_SPLIT}.${SHEET2} | column -t > ${CSV_FINAL}My Request:最终命令,将两个文件合并在一起的命令:
paste -d ';' ${CSV_SPLIT}.${SHEET1} ${CSV_SPLIT}.${SHEET2} | column -t > ${CSV_FINAL}工作正常,但是第二个文件打印在01/01/2013的行中。
我不知道如何修改这个脚本的逻辑,从14/02/2013行开始粘贴第二个文件。有谁可以帮我?
发布于 2017-05-09 14:49:03
看起来您需要按日期排序和合并文件。
File1:
sort -n -k3 -k2 -k1 -t '/' -o File1.sorted File1File2:
sort -n -k3 -k2 -k1 -t '/' -o File2.sorted File2合并:
sort -n -m -k3 -k2 -k1 -t '/' -o result.sorted File1.sorted File2.sorted或者使用虚拟文件描述符作为一行:
sort -n -m -k3 -k2 -k1 -t '/' <(sort -n -k3 -k2 -k1 -t '/' File1) <(sort -n -k3 -k2 -k1 -t '/')-n将对字段进行数字排序,而不是词法排序。
-m合并两个排序的文件
-k将按年、日、月进行排序(字段分别为3、2、1)
-t设置裁剪器
例子:
sort -m -k3 -k2 -k1 -t '/' <(sort -k3 -k2 -k1 -t '/' t2) <(sort -k3 -k2 -k1 -t '/' t1)
12/01/2012;banana;pear
15/02/2013;apple;mango
14/02/2013;banana;cherry
02/01/2013;cat;dog
03/01/2013;frog;whale
01/01/2013;horse;penguin
04/01/2013;mouse;bird
16/02/2013;orange;strawberry
13/03/2015;mango;papaya发布于 2017-05-09 15:23:30
我就是这样解决的:
if [ $epoch_date -le 1360713600 ]; then
echo "${epoch_date};${colB};${colF}" >> ${CSV_SPLIT}.${SHEET1}.part1
else
echo "${epoch_date};${colB};${colF}" >> ${CSV_SPLIT}.${SHEET1}
fi
[...]
##########################
# Merge the csv together #
##########################
cat ${CSV_SPLIT}.${SHEET1}.part1 > ${CSV_FINAL}
paste -d ';' ${CSV_SPLIT}.${SHEET1} ${CSV_SPLIT}.${SHEET2} | column -t >> ${CSV_FINAL}当我阅读file1时,我将它分成两部分,1部分包含2月14日之前的日期和值,另一部分包含其他部分。
而且..。很简单。
https://stackoverflow.com/questions/43872426
复制相似问题