使用 shell 脚本从文件中提取唯一的行块

2024-02-13

从文件中提取行块时,我遇到了一些问题。考虑以下两个文件

File-1
1.20/abc/this_is_test_1
perl/RRP/RRP-1.30/JEDI/JEDIExportSuccess2
exec perl/RRP/RRP-1.30/JEDI/CommonReq/confAbvExp
perl/LRP/BaseLibs/close-MMM
exec perl/LRP/BaseLibs/launchLRPCHURRTA("TYRE")
this/or/that

File-2
exec 1.20/setup/testird
exec 1.20/sql/temp/Test3
exec 1.20/setup/testxyz
exec 1.20/sql/fondle_opr_sql_labels
exec 1.20/setup/testird
exec 1.20/sql/temp/NEWTest
exec 1.20/setup/testxyz
exec 1.20/sql/fondle_opr_sql_xfer
exec 1.20/setup/testird
exec 1.20/sql/set_sec_not_0
exec 1.20/setup/testpqr
exec 1.20/sql/sql_ba_statuses_on_mult
exec perl/RRP/SetupReq/testdef_ijk
exec perl/RRP/RRP-1.30/JEDI/SetupReq/confAbvExp
exec perl/RRP/RRP-1.30/JEDI/JEDIExportSuccess1
exec perl/RRP/SetupReq/testdef_ijk
exec perl/RRP/RRP-1.30/JEDI/SetupReq/confAbvExp
exec perl/RRP/RRP-1.30/JEDI/JEDIExportSuccess2
exec perl/RRP/SetupReq/testdef_ijk
exec perl/RRP/RRP-1.30/JEDI/SetupReq/confAbvExp
exec perl/RRP/RRP-1.30/JEDI/JEDIExportSuccess3
exec 1.20/setup/testird
exec 1.20/sql/sqlmenu_purr_labl
exec 1.20/sql/est_time_at_non_drp_plc
exec 1.20/sql/half_Brd_Supply_mix_single
exec 1.20/setup/testird
exec 1.20/sql/temp/Test
exec 1.20/setup/testird
exec 1.20/sql/temp/Test2
exec perl/LRP/SetupReq/testird_LRP("LRP")
exec perl/BaseLibs/launch_client("LRP")
exec perl/LRP/LRP-classic-4.14/churrip/chorSingle
exec perl/LRP/BaseLibs/setupLRPMMMTab
exec perl/LRP/BaseLibs/launchMMM
exec perl/LRP/BaseLibs/launchLRPCHURRTA("TYRE")
#PAUSE Expand Churrip tree view & open all nodes
exec perl/LRP/LRP-classic-4.14/Corrugator/multipleSeriesWeb
exec perl/BaseLibs/ShutApp("Self Destruction System")
exec perl/LRP/BaseLibs/close-MMM
exec 1.20/setup/testmiddle
exec 1.20/sql/collective_reads
exec 1.20/setup/testinit
exec 1.20/abc/this_is_test_1
exec 1.20/abc/this_is_test_1
exec perl/LRP/SetupReq/abcDEF
exec perl/BaseLibs/launch_client("sqlC","LRP")
exec perl/LRP/LRP-perl-4.20/fireTrigger

现在,对于 File-1 中的每一行,我想从 File-2 中提取相关的行块。 File-2中的一个块定义如下

exec 1.20/setup/xxxxx
blah blah blah
blah blah blah
.
.
.
all lines till next setup line is found

例如

exec 1.20/setup/testinit
exec 1.20/abc/this_is_test_1
exec 1.20/abc/this_is_test_1

or

exec perl/LRP/SetupReq/xxxxx
blah blah blah
blah blah blah
.
.
.
all lines till next setup line is found

例如

exec perl/LRP/SetupReq/testird_LRP("LRP")
exec perl/BaseLibs/launch_client("LRP")
exec perl/LRP/LRP-classic-4.14/churrip/chorSingle
exec perl/LRP/BaseLibs/setupLRPMMMTab
exec perl/LRP/BaseLibs/launchMMM
exec perl/LRP/BaseLibs/launchLRPCHURRTA("TYRE")
#PAUSE Expand Churrip tree view & open all nodes
exec perl/LRP/LRP-classic-4.14/Corrugator/multipleSeriesWeb
exec perl/BaseLibs/ShutApp("Self Destruction System")
exec perl/LRP/BaseLibs/close-MMM

到目前为止,我已成功借助以下脚本从 File-2 中提取了相关块

Shell Script
#set -x
FLBATCHLIST=$1
BATCHFILE=$2

TEMPDIR="/usr/tmp/tempBatchDir"
rm -rf $TEMPDIR/*

WORKFILE="$TEMPDIR/failedTestList.txt"
CPBATCHFILE="$TEMPDIR/orig.test"
TESTSETFILE="$TEMPDIR/testset.txt"
TEMPFILE="$TEMPDIR/temp.txt"
DIFFFILE="$TEMPDIR/diff.txt"

#Output
FAILEDBATCH="$TEMPDIR/FailedBatch.test"
LOGFILE="$TEMPDIR/log.txt"

createBatch ()
{

TESTNAME=$1
#First process the $CPBATCHFILE to not have any blank lines, leading and trailing whitespaces
# delete BOTH leading and trailing whitespace from each line and blank lines from file
sed -i 's/^[[:space:]]*//;s/[[:space:]]*$//g;/^$/d' $CPBATCHFILE
FOUND=0
STATUS=1
while [ $STATUS -ne "0" ]
do
        if [ ! -s $CPBATCHFILE ]; then
                echo "$CPBATCHFILE is empty" >> $LOGFILE
                STATUS=0
        fi
        awk '/[Ss]etup.*[Tt]est/ || /perl\/[[:alpha:]]*\/[Ss]etup[rR]eq/{if(b) exit; else b=1}1' $CPBATCHFILE > $TESTSETFILE
        grep -i "$TESTNAME$" $TESTSETFILE >> $LOGFILE 2>&1
        if [ $? -eq "0" ]; then
                echo "test found" >> $LOGFILE
                cat $TESTSETFILE >> $FAILEDBATCH
                FOUND=1
        fi
        TSTFLLINES=`wc -l < $TESTSETFILE`
        CPBTCHLINES=`wc -l < $CPBATCHFILE`
        DIFF=`expr $CPBTCHLINES - $TSTFLLINES`
        tail -n $DIFF $CPBATCHFILE > $DIFFFILE
        mv $DIFFFILE $CPBATCHFILE
done

if [ $FOUND -eq 0 ]; then
        echo $TESTNAME > $TEMPDIR/test.txt
        ABSTEST=$(echo $TESTNAME | sed 's/\\//g')
        echo "FATAL ERROR: Test \"$ABSTEST\" not found in batch" | tee -a $LOGFILE
fi

}

####STARTS HERE####
mkdir -p $TEMPDIR
#cat  $TEMPDIR/test.txt
#FLBATCHLIST="$TEMPDIR/test.txt"
# delete run, BOTH leading and trailing whitespace and blank lines from file
sed 's/^[eE][xX][eE][cC]//g;s/^[[:space:]]*//;s/[[:space:]]*$//g;/^$/d' $FLBATCHLIST > $WORKFILE

# escaping special characters like '\' and '.' in the path names for better grepping
sed -i 's/\([\/\.\"]\)/\\\1/g' $WORKFILE

for fltest in $(cat $WORKFILE)
do
        echo $fltest >> $LOGFILE
        cp $BATCHFILE $CPBATCHFILE
        createBatch $fltest
done

sed -i 's/\//\\/g' $FAILEDBATCH
## Clean up
cp $FAILEDBATCH .

这个脚本的问题是

  1. 遍历 File-2 来查找 File-1 的每一行需要一些时间。我想知道是否有更好的解决方案,我只需遍历 File-2 一次。

  2. 该脚本确实解决了我的问题,但我留下的文件中包含重复的行块。我想知道有没有办法删除重复的行块。

这是我执行脚本时的输出

exec 1.20\setup\testinit
exec 1.20\abc\this_is_test_1
exec 1.20\abc\this_is_test_1
exec perl\RRP\SetupReq\testdef_ijk
exec perl\RRP\RRP-1.30\JEDI\SetupReq\confAbvExp
exec perl\RRP\RRP-1.30\JEDI\JEDIExportSuccess2
exec perl\RRP\SetupReq\testdef_ijk
exec perl\RRP\RRP-1.30\JEDI\SetupReq\confAbvExp
exec perl\RRP\RRP-1.30\JEDI\JEDIExportSuccess1
exec perl\RRP\SetupReq\testdef_ijk
exec perl\RRP\RRP-1.30\JEDI\SetupReq\confAbvExp
exec perl\RRP\RRP-1.30\JEDI\JEDIExportSuccess2
exec perl\RRP\SetupReq\testdef_ijk
exec perl\RRP\RRP-1.30\JEDI\SetupReq\confAbvExp
exec perl\RRP\RRP-1.30\JEDI\JEDIExportSuccess3
exec perl\LRP\SetupReq\testird_LRP("LRP")
exec perl\BaseLibs\launch_client("LRP")
exec perl\LRP\LRP-classic-4.14\churrip\chorSingle
exec perl\LRP\BaseLibs\setupLRPMMMTab
exec perl\LRP\BaseLibs\launchMMM
exec perl\LRP\BaseLibs\launchLRPCHURRTA("TYRE")
#PAUSE Expand Churrip tree view & open all nodes
exec perl\LRP\LRP-classic-4.14\Corrugator\multipleSeriesWeb
exec perl\BaseLibs\ShutApp("Self Destruction System")
exec perl\LRP\BaseLibs\close-MMM
exec perl\LRP\SetupReq\testird_LRP("LRP")
exec perl\BaseLibs\launch_client("LRP")
exec perl\LRP\LRP-classic-4.14\churrip\chorSingle
exec perl\LRP\BaseLibs\setupLRPMMMTab
exec perl\LRP\BaseLibs\launchMMM
exec perl\LRP\BaseLibs\launchLRPCHURRTA("TYRE")
#PAUSE Expand Churrip tree view & open all nodes
exec perl\LRP\LRP-classic-4.14\Corrugator\multipleSeriesWeb
exec perl\BaseLibs\ShutApp("Self Destruction System")
exec perl\LRP\BaseLibs\close-MMM

我尝试通过网络搜索答案,但无法找到适合我需求的答案。

给定 File-1 和 File-2 这是我期望我的脚本输出的内容 (我已经列出了 FILE-1 中每一行的预期输出)

For line "1.20/abc/this_is_test_1" in FILE-1
Output
exec 1.20/setup/testinit
exec 1.20/abc/this_is_test_1
exec 1.20/abc/this_is_test_1

For line "perl/RRP/RRP-1.30/JEDI/JEDIExportSuccess2" in FILE-1
Output
exec perl/RRP/SetupReq/testdef_ijk
exec perl/RRP/RRP-1.30/JEDI/SetupReq/confAbvExp
exec perl/RRP/RRP-1.30/JEDI/JEDIExportSuccess2

For line "exec perl/RRP/RRP-1.30/JEDI/CommonReq/confAbvExp" in FILE-1
Output
do nothing as there is no line matching this is in FILE-2

For line "perl/LRP/BaseLibs/close-MMM" in FILE-1
Output
exec perl/LRP/SetupReq/testird_LRP("LRP")
exec perl/BaseLibs/launch_client("LRP")
exec perl/LRP/LRP-classic-4.14/churrip/chorSingle
exec perl/LRP/BaseLibs/setupLRPMMMTab
exec perl/LRP/BaseLibs/launchMMM
exec perl/LRP/BaseLibs/launchLRPCHURRTA("TYRE")
#PAUSE Expand Churrip tree view & open all nodes
exec perl/LRP/LRP-classic-4.14/Corrugator/multipleSeriesWeb
exec perl/BaseLibs/ShutApp("Self Destruction System")
exec perl/LRP/BaseLibs/close-MMM    

For line "exec perl/LRP/BaseLibs/launchLRPCHURRTA("TYRE")" in FILE-1
Output
Do nothing as it would generate the same black as line "perl/LRP/BaseLibs/close-MMM" in FILE-1 did

For Line "this/or/that" in FILE-1
Output
Do nothing as there is no line matching this is in FILE-2

所以我的最终输出应该类似于(块的顺序无关紧要)

exec 1.20/setup/testinit
exec 1.20/abc/this_is_test_1
exec 1.20/abc/this_is_test_1

exec perl/RRP/SetupReq/testdef_ijk
exec perl/RRP/RRP-1.30/JEDI/SetupReq/confAbvExp
exec perl/RRP/RRP-1.30/JEDI/JEDIExportSuccess2

exec perl/LRP/SetupReq/testird_LRP("LRP")
exec perl/BaseLibs/launch_client("LRP")
exec perl/LRP/LRP-classic-4.14/churrip/chorSingle
exec perl/LRP/BaseLibs/setupLRPMMMTab
exec perl/LRP/BaseLibs/launchMMM
exec perl/LRP/BaseLibs/launchLRPCHURRTA("TYRE")
#PAUSE Expand Churrip tree view & open all nodes
exec perl/LRP/LRP-classic-4.14/Corrugator/multipleSeriesWeb
exec perl/BaseLibs/ShutApp("Self Destruction System")
exec perl/LRP/BaseLibs/close-MMM

如果有人能给我一些关于如何继续的指示,那就太好了。是的,我忘了提及,这不是一个家庭作业问题:-)。

非常感谢


如果行顺序无关紧要,您可以通过命令提示符从文件中删除重复项:

sort filename | uniq

为了查找两个文件中都存在哪些行,我使用了一个创建散列(或关联数组,如果您愿意的话)的 perl 脚本。然后我扫描文件 A,将每一行添加到哈希中,使用该行作为键,并将值设置为 1。然后我对文件 A 执行相同的操作,但将值设置为 2,并且如果键已经存在,我加了 2 个。结果将只遍历每个文件一次,最后我知道如果密钥的值为 1,则它只存在于文件 A 中,如果它的值为 2,则它只存在于文件 B 中,并且如果它的值为 3,则它同时存在于两者中。

Edit:我在一个项目中发现了一些 Perl 代码,它们的作用正是我上面描述的。在这段代码中,我只是追求差异,但应该很容易根据您的需要进行修改

my %found;
foreach my $item (@qlist) { $found{$item} += 2 };
foreach my $item (@xlist) { $found{$item} += 1 };

foreach my $found (keys(%found))
{
  if    ($found{$found} == 3)
  {
    # It's in both files. Not doing anything.
  }
  elsif ($found{$found} == 2)
  {
    print "$found found in the QC-list, but not the x-list.\n";
  }
  elsif ($found{$found} == 1)
  {
    print "$found found in the x-list, but not the QC-list.\n";
  }
}
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

使用 shell 脚本从文件中提取唯一的行块 的相关文章

随机推荐

  • 如何在java中将Mongo DB中的数据导出为ex​​cel格式

    MongoDB 中的架构 姓名 卡马拉 流动 Date 2018 08 03 New set Form y 1 d 3 p 3 我的java代码 公共静态无效主 字符串 args String db Database String col
  • 处理 JSON 对象的最佳方法是什么?

    我有一个代表 JSON feed 的大字符串 我的应用程序从远程网络服务下载此提要 问题 1 下载 JSON feed 后 我应该将其存储在哪里 现在我将其存储在应用程序首选项中并且工作正常 我只是感兴趣是否有任何理由不这样做 或者是否有更
  • 编写 gem 时设置配置设置

    我正在编写一个 gem 我希望它可以在有或没有 Rails 环境的情况下工作 我有一个Configuration允许配置 gem 的类 module NameChecker class Configuration attr accessor
  • 在列表(或其他数据结构)中有效插入多个元素并保持其顺序

    我有一个项目列表 应该一个接一个地插入到类似列表的数据结构中 并且我有每个项目应该插入的索引 例如 items itemX itemY itemZ indexes 0 0 1 预期的结果是有一个像这样的列表 result itemY ite
  • C++ 模板类;任意容器类型的函数,如何定义它?

    好的 简单的模板问题 假设我定义我的模板类是这样的 template
  • 在 macOS 上的 MAMP 或 XAMPP 上安装 phalcon 时出现错误

    我正在尝试在 macOS 上的 xampp 或 MAMP 上安装 phalcon 请告诉我如何在 MAMP 上正确安装 phalcon 我在 XAMPP 上安装时遇到相同的错误 我用这个教程https madebyextreme com i
  • 通过连接到满足某些条件的另一个表的最新记录来更新表

    我试图避免为此解决方案使用循环的冲动 而是使用基于集合的操作 我需要根据最近出现的与另一个表的连接来更新表中的每条记录 我的第一个想法是加入到我需要 最近日期 的表并根据连接条件进行分组 但是使用GROUP BY with UPDATE是无
  • new() 没有 delete() 是未定义行为还是仅仅是内存泄漏? [复制]

    这个问题在这里已经有答案了 可能的重复 内存泄漏是 C 中的 未定义行为 类问题吗 https stackoverflow com questions 1978709 are memory leaks undefined behavior
  • 使用 terraform 部署 Azure 功能

    我有以下 terraform 代码 用于使用 zip 部署将函数应用程序和函数部署到 Azure 门户 terraform required providers azurerm source hashicorp azurerm versio
  • 查找适用于 Windows 的 javafx jar 文件

    有谁知道在哪里可以找到该jar文件javafxWindows 的包 我只能找到 zip 文件和 exe 文件 有人可以回答并提供下载包的链接吗 您需要首先安装 javafx sdk 2 0 1 windows i586 exe 这将在您的计
  • 无法将 Firebase 导入到 Swift 类中

    我对 Firebase 和构建 iOS 应用程序完全陌生 在 Xcode 7 中 我尝试将 Firebase 导入到我的 Swift 类中 在一个 swift 文件中 我输入了 import Firebase 我收到一条错误消息 没有这样的
  • MvvmCross 5.4 在 ConsoleLogProvider 中使用 NullRef 启动应用程序时崩溃

    我已更新我的 Xamarin Android 应用程序包MvvmCross from 5 3 2 to 5 4并且应用程序在启动时开始崩溃 我手动确定原因是链接器 我有link SDK libs only选项已启用 随着None选项它工作得
  • Spinner 的 RxBindings?

    我是新的 android 和 rxjava 我经历过很多使用 rxbindings 监听事件的例子 比如这个 RxView clicks b subscribe new Action1
  • Java,如何绘制不断变化的图形

    以前没有这样做过 所以显然我很糟糕 这里 当前鼠标位置周围的 64 像素在表单上绘制得稍大一些 问题是 它 有点 慢 而且我不知道从哪里开始修复 除此之外 我创建了一个线程 在完成后不断调用更新图形和一些类似文本的 fps 以真正显示绘制事
  • RabbitTemplate 接收并重新排队

    我想从队列接收消息并立即将它们出队 事实上我想模仿rabbitMQ管理控制台的行为 它可以接收消息并将其重新排队 所以我的问题是如何做到这一点 起初 我试图克隆消息并重新发送它们 但rabbitTemplate似乎无法将消息直接发送到队列
  • Heroku 登录错误:证书链中的自签名证书

    我正在尝试在 Mac 上使用 Heroku CLI 当我尝试使用 Heroku 登录名登录 Heroku 并提供我的凭据时 出现以下错误 错误 证书链中的自签名证书 我已多次尝试卸载并重新安装它 但仍然收到此错误 我该如何解决 由于我的组织
  • 传递任意大小的二维数组

    您好 我正在研究排序算法 为此我想制作一个简单的程序来从文本文件中获取整数数组 在这样做的同时 我遇到了一些关于将它们作为参数的数组和函数的麻烦和问题 这是我所做的 include
  • MySQL 中的复合主键性能缺陷

    我们有一个表 其复合主键由三个字段组成 在 MySQL 5 1 中 该表每秒有近 200 次插入和 200 次选择 表的大小约为 100 万行 并且还在不断增加 我的问题是 复合主键 是否会降低该表上的插入和选择的性能 我应该使用简单的自动
  • 正确实现不同类型但语义等效的两个对象的比较

    我发现了类似的问题 如何比较具有相似属性的两个截然不同的对象 https stackoverflow com questions 1725327 how to compare two distinctly different objects
  • 使用 shell 脚本从文件中提取唯一的行块

    从文件中提取行块时 我遇到了一些问题 考虑以下两个文件 File 1 1 20 abc this is test 1 perl RRP RRP 1 30 JEDI JEDIExportSuccess2 exec perl RRP RRP 1