【问题标题】:compare files in shell script with md5sum and create csv for the changed file将 shell 脚本中的文件与 md5sum 进行比较,并为更改的文件创建 csv
【发布时间】:2020-02-12 16:12:32
【问题描述】:

我对 shell 脚本非常陌生,并找到了一种在使用 md5sum 时如何使用 shell 脚本比较文件的方法。

我想比较 shell 脚本中的 Options_oldOptions_new 文件,并确定新文件中添加的新 Ticker 字段值。对于这个新的股票代码字段值,我想创建 CSV 文件。

例如,如果我们比较 Options_oldOptions_new 文件并检查 Options_new 文件,则会添加新的代码字段值 510051 2 C2.50510052 2 P2.50,我想在 CSV 文件中创建和打印此值。

Options_new.out.gz 文件

START-OF-FILE
PROGRAMNAME=getdata
DATEFORMAT=yyyymmdd
START-OF-FIELDS
TICKER
EXCH_CODE
END-OF-FIELDS
TIMESTARTED=Wed Feb 12 19:30:38 JST 2020
START-OF-DATA
510051 CH 02/26/20 C2.5 Equity|0|75|510051 2 C2.50|CH
510052 CH 02/26/20 P2.5 Equity|0|75|510052 2 P2.50|CH
510050 CH 02/26/20 C2.55 Equity|0|75|510050 2 C2.55|CH
510050 CH 02/26/20 P2.55 Equity|0|75|510050 2 P2.55|CH
END-OF-DATA
DATARECORDS=1140
TIMEFINISHED=Wed Feb 12 19:32:50 JST 2020
END-OF-FILE

Options_old.out.gz 文件

START-OF-FILE
PROGRAMNAME=getdata
DATEFORMAT=yyyymmdd
START-OF-FIELDS
TICKER
EXCH_CODE
END-OF-FIELDS
TIMESTARTED=Wed Feb 12 19:30:38 JST 2020
START-OF-DATA
510050 CH 02/26/20 C2.5 Equity|0|75|510050 2 C2.50|CH
510050 CH 02/26/20 P2.5 Equity|0|75|510050 2 P2.50|CH
510050 CH 02/26/20 C2.55 Equity|0|75|510050 2 C2.55|CH
510050 CH 02/26/20 P2.55 Equity|0|75|510050 2 P2.55|CH
END-OF-DATA
DATARECORDS=1140
TIMEFINISHED=Wed Feb 12 19:32:50 JST 2020
END-OF-FILE

我已经启动了代码,但不明白如何比较特定字段然后生成 csv 文件:

#!/bin/sh

OLD_PATH="/opt/old"
NEW_PATH="/opt/new"

FILES="${FILES} Options_new.out.gz Options_old.out.gz"

for FILE in `echo ${FILES}`
do
   MD5SUM_NEW=`md5sum ${OLD_PATH}/${FILE} | awk '{print $1}'`
   MD5SUM_OLD=`md5sum ${NEW_PATH}/${FILE} | awk '{print $1}'`

   if [ "${MD5SUM_NEW}" != "${MD5SUM_OLD}" ]; then
      echo "Found new Version of ${FILE}"
#currently i am comparing the data from the whole file but i want to compare the data only for the Ticker value in the both files

#here create new csv file with the new ticker value found in Options_new.out.gz file

   fi

exit ${EXIT}

【问题讨论】:

  • 为什么要使用 md5sum ?您的代码尝试将“/opt/old/Options_new.out.gz”与“/opt/new/Options_new.out.gz”和“/opt/old/Options_old.out.gz”与“/opt/new/”进行比较Options_old.out.gz”,但从文本来看,您似乎想将 Options_new.out.gz 与 Options_old.out.gz 进行比较。它是哪一个?用于比较的“关键”是什么?
  • md5 是一个加密哈希。除此之外,这意味着不同的文件应该有不同的哈希值,但是比较哈希值应该根本没有告诉你具体的区别是什么。这使得它完全不适合你想要做的事情。我对你的实际目标有点困惑,但你需要非常不同的工具来实现它。
  • 抱歉给您带来了困惑..我想比较 /opt/new/Options_new.out.gz 和 /opt/old/Options_old.out.gz 并比较 Ticker 字段,如果有新的我在 Option_new.out.gz 中找到的 Ticker 字段值然后我想用这个字段值创建 csv....我没有必要使用 md5sum...我只是发现使用 md5sum 我们可以实现比较... ..代码只是基础,可能不正确,因为我不知道该怎么做:(
  • @Andrew,您仍然没有回答我的最后一个问题 - 用于比较代码的关键是什么。您说“510051 2 C2.50”是一个新值,该值是“2 C2.50”还是整个文件的新值? (旁注:如果您希望我收到您的回答通知,您需要像这样@Sorin 提及我)

标签: bash shell compare export-to-csv md5sum


【解决方案1】:

也许值得深思 运行以检查是否不同,如果不同,则打印包含您希望保存到 csv 的位的行

#!/bin/bash

#Check if file are different then grep for word differ 
#normally would spit out Files file2 and file1 differ
# flags are -F fixed string, -w match only full words
# -q quiet ie no output to stdout (screen)

if $(diff -q "$2" "$1" | grep -Fwq "differ")
then
    #create a var of the changed text, awk looking at 
    #begining of line to see if begins with > and then
    #output the full fine for awk to then select the 
    #vars you want
    changeSyn=$(diff file2 file1 | awk '$1 ~ /^ *>/' | awk '{print $2","$5","$7 }')
    #same again only for new vars
    addedSyn=$(diff file2 file1 | awk '$1 ~ /^ *</' | awk '{print $2","$5","$7 }')
    echo "$changeSyn"
    echo "$addedSyn"
else
    echo "No change"
fi

【讨论】:

    【解决方案2】:

    尝试使用融合视觉

     meld file1 file2
    

    命令行差异

     diff file1 file2
     10,11c10,11
     < 510051 CH 02/26/20 C2.5 Equity|0|75|510051 2 C2.50|CH
     < 510052 CH 02/26/20 P2.5 Equity|0|75|510052 2 P2.50|CH
     ---
     > 510050 CH 02/26/20 C2.5 Equity|0|75|510050 2 C2.50|CH
     > 510050 CH 02/26/20 P2.5 Equity|0|75|510050 2 P2.50|CH
    

    【讨论】:

    • 我想在命令行中尝试... 10,11c10,11 menas 是什么?
    • 差异的输出是行号已经改变,抱歉响应速度太慢了(医院工作人员)
    • so file1 的第 10 行和第 11 行与 file2 的第 10 行和第 11 行相比发生了变化
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2022-01-17
    • 2014-12-10
    • 2017-01-08
    • 1970-01-01
    • 2016-10-18
    相关资源
    最近更新 更多