Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/linux/27.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/perl/11.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
在GNU/Linux中,匹配文件中的模式并使用找到的字符串提取另一个文件中包含字符串的行_Linux_Perl_Shell_Awk_Sed - Fatal编程技术网

在GNU/Linux中,匹配文件中的模式并使用找到的字符串提取另一个文件中包含字符串的行

在GNU/Linux中,匹配文件中的模式并使用找到的字符串提取另一个文件中包含字符串的行,linux,perl,shell,awk,sed,Linux,Perl,Shell,Awk,Sed,我是一个对shell脚本的可怕世界的新手 文件b.txt包含逗号分隔文本格式的错误代码。错误代码可以与此模式匹配-“[A-Z]\{2\}-[A-Z0-9]\{4\}”。b.txt的示例 LO-5645,SE-DH68,MY-2255,MI-9878,SY-FC25, ER-55R8,LO-5645, EU-1C07,ER-9871,EY-5523,MM-2564, FO-D389,XU-2659,EU-1568, etc etc.... LO-5645,SE-DH68,MY-2255,MI-9

我是一个对shell脚本的可怕世界的新手

文件
b.txt
包含逗号分隔文本格式的错误代码。错误代码可以与此模式匹配-“
[A-Z]\{2\}-[A-Z0-9]\{4\}
”。
b.txt的示例

LO-5645,SE-DH68,MY-2255,MI-9878,SY-FC25,
ER-55R8,LO-5645,
EU-1C07,ER-9871,EY-5523,MM-2564,
FO-D389,XU-2659,EU-1568,
etc etc....
LO-5645,SE-DH68,MY-2255,MI-9878,SY-FC25: System error on domain,
ER-55R8: fatal error on platform xx22,LO-5645,
EU-1C07,ER-9871,EY-5523,MM-2564: Driver not initialized,
FO-D389,XU-2659,EU-1568: system not initializing,
etc etc...
文件
a.txt
每行包含一个错误代码和错误代码的说明。
a.txt
示例:

EU-1568: system not initializing
ER-55R8: fatal error on platform xx22
MM-2564: Driver not initialized
LO-24DE: Lot failed
SY-FC25: System error on domain
etc etc.....
我想将这两个文件中的信息结合起来,这样我就可以创建一个文件
c.txt
,其中包含逗号分隔的错误以及从
b.txt
中提取的错误消息的描述

c.txt

LO-5645,SE-DH68,MY-2255,MI-9878,SY-FC25,
ER-55R8,LO-5645,
EU-1C07,ER-9871,EY-5523,MM-2564,
FO-D389,XU-2659,EU-1568,
etc etc....
LO-5645,SE-DH68,MY-2255,MI-9878,SY-FC25: System error on domain,
ER-55R8: fatal error on platform xx22,LO-5645,
EU-1C07,ER-9871,EY-5523,MM-2564: Driver not initialized,
FO-D389,XU-2659,EU-1568: system not initializing,
etc etc...
我解决这个问题的想法是:我尝试使用while循环逐行读取b.txt,并使用
grep-o
将错误代码的模式精确匹配到数组变量中。然后使用内部
For
循环,我尝试一次读取该数组的一个元素,并匹配a.txt中包含错误代码的行

如果我能得到你关于如何更好地解决这个问题的一些想法,那就太好了


Awk、Sed、grep、perl、cut都受欢迎。

寻找精确匹配

awk -F'[,:]' -v OFS=',' '
 FNR==NR{error[$1]=$NF;next}
 { 
     for(i=1; i<=NF;i++)if($i in error)$i=$i":"error[$i]
 }1' a.txt b.txt >c.txt
输出

$ cat a.txt 
EU-1568: system not initializing
ER-55R8: fatal error on platform xx22
MM-2564: Driver not initialized
LO-24DE: Lot failed
SY-FC25: System error on domain
etc etc.....

$ cat b.txt 
LO-5645,SE-DH68,MY-2255,MI-9878,SY-FC25,
ER-55R8,LO-5645,
EU-1C07,ER-9871,EY-5523,MM-2564,
FO-D389,XU-2659,EU-1568,
etc etc....
$ awk -F'[,:]' -v OFS=',' '
FNR==NR{error[$1]=$NF;next}
{ 
     for(i=1; i<=NF;i++)if($i in error)$i=$i":"error[$i]
}1' a.txt b.txt
LO-5645,SE-DH68,MY-2255,MI-9878,SY-FC25: System error on domain,
ER-55R8: fatal error on platform xx22,LO-5645,
EU-1C07,ER-9871,EY-5523,MM-2564: Driver not initialized,
FO-D389,XU-2659,EU-1568: system not initializing,
etc etc....
$awk-F'[,:]'-v OFS=',''
FNR==NR{error[$1]=$NF;next}
{ 

对于(i=1;我在一行中有多个错误代码,在
a.txt
中有错误描述?如果你不尝试用你有限的脚本技能来做这件事,你怎么能做得更好呢?@Matt Jacob,我发布这个问题的目的是想得到一些想法,以正确的方式解决这个问题。我只是被磨练了一下在我上面的问题中,如果没有一些技巧,我会陷入使用循环逐行读取的陷阱。@anubhava,文件a.txt是我通过脚本创建的,它总是在每行中包含一个错误代码和一个描述。因此,人们喜欢看到一个人在解决问题方面做出一些努力或尝试问题之王。即使只是你认为你可能会采取的一系列步骤,做点什么总比什么都没有好。你的问题目前的写作方式听起来像是一份要求文件,供你雇佣来为你工作的人使用。@Akshay Hedge,非常感谢你,现在我可以用这个想法来解决我在di中面临的类似问题了不同的数据集。@Akshay:关于反对票,有两个有用的提示:(1)没有发表评论的反对票者很少会回来解释他们的理由。他们选择匿名,很可能希望保持匿名,而且无论如何也不会看到你的问题。(2)然而,我们可以猜测为什么一个答案被否决。你的作品看起来非常有用,所以我的猜测是,一位读者因为你帮助了一个自己可能根本没有付出任何努力的人而感到沮丧,他正确地认为有人会为他们做免费的工作。最终,你是否回答一个问题,有时回答一个问题,取决于你自己stion asker陷入困境,很高兴能为他们提供所需的帮助。然而,我们试图平衡这一点,尽量不鼓励认为堆栈溢出是一个指定需求的平台,并期望志愿者完成整个过程。@Akshay:你太担心DVs了-不要把他们当回事。你是我收到了35+和2-所以你从这个答案中获益匪浅。即使你有所损失,知道你帮助了别人也会感到满足,对吗?
:-)
@halfer:是的,谢谢你的鼓励,你的鼓励对我来说意义重大。