首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >使用粘贴合并两个文件,但在N行之后

使用粘贴合并两个文件,但在N行之后
EN

Stack Overflow用户
提问于 2017-05-09 14:22:47
回答 2查看 65关注 0票数 0

我有两个xlsxfile,它们不同,但只有一个共同点:日期。我必须转换为csv并将它们合并在一起。

file1

代码语言:javascript
复制
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

代码语言:javascript
复制
14/02/2013;banana;cherry
15/02/2013;apple;mango
16/02/2013;orange;strawberry
[...]
until nowadays, may 2017

--这是我想要达到的结果:,但是日期是划时代的(在这里,我把它们留在这里,而不是划时代,这样您就可以阅读它们)。

代码语言:javascript
复制
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
[...]

下面是我做的脚本。

代码语言:javascript
复制
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:最终命令,将两个文件合并在一起的命令:

代码语言:javascript
复制
paste -d ';' ${CSV_SPLIT}.${SHEET1} ${CSV_SPLIT}.${SHEET2} | column -t > ${CSV_FINAL}

工作正常,但是第二个文件打印在01/01/2013的行中。

我不知道如何修改这个脚本的逻辑,从14/02/2013行开始粘贴第二个文件。有谁可以帮我?

EN

回答 2

Stack Overflow用户

发布于 2017-05-09 14:49:03

看起来您需要按日期排序和合并文件。

File1:

代码语言:javascript
复制
sort -n -k3 -k2 -k1 -t '/' -o File1.sorted File1

File2:

代码语言:javascript
复制
sort -n -k3 -k2 -k1 -t '/' -o File2.sorted File2

合并:

代码语言:javascript
复制
sort -n -m -k3 -k2 -k1 -t '/' -o result.sorted File1.sorted File2.sorted

或者使用虚拟文件描述符作为一行:

代码语言:javascript
复制
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设置裁剪器

例子:

代码语言:javascript
复制
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
票数 0
EN

Stack Overflow用户

发布于 2017-05-09 15:23:30

我就是这样解决的:

代码语言:javascript
复制
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日之前的日期和值,另一部分包含其他部分。

而且..。很简单。

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/43872426

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档