gpt4 book ai didi

linux - 逐行读取并逐行打印匹配项

转载 作者:IT王子 更新时间:2023-10-29 00:40:35 24 4
gpt4 key购买 nike

我是 shell 脚本的新手,如果我能在下面的问题上得到一些帮助,那就太好了。

我想逐行读取文本文件,并将该行中所有匹配的模式打印到新文本文件中的一行。

例如:

$ cat input.txt

SYSTEM ERROR: EU-1C0A Report error -- SYSTEM ERROR: TM-0401 DEFAULT Test error
SYSTEM ERROR: MG-7688 DEFAULT error -- SYSTEM ERROR: DN-0A00 Error while getting object -- ERROR: DN-0A52 DEFAULT Error -- ERROR: MG-3218 error occured in HSSL
SYSTEM ERROR: DN-0A00 Error while getting object -- ERROR: DN-0A52 DEFAULT Error
SYSTEM ERROR: EU-1C0A error Failed to fill in test report -- ERROR: MG-7688

预期输出如下:

$ cat output.txt

EU-1C0A TM-0401
MG-7688 DN-0A00 DN-0A52 MG-3218
DN-0A00 DN-0A52
EU-1C0A MG-7688

我尝试了以下代码:

while read p; do
grep -o '[A-Z]\{2\}-[A-Z0-9]\{4\}' | xargs
done < input.txt > output.txt

产生了这个输出:

EU-1C0A TM-0401 MG-7688 DN-0A00 DN-0A52 MG-3218 DN-0A00 DN-0A52 EU-1C0A MG-7688 .......

然后我也尝试了这个:

while read p; do
grep -o '[A-Z]\{2\}-[A-Z0-9]\{4\}' | xargs > output.txt
done < input.txt

但没有帮助:(

也许还有另一种方法,我对 awk/sed/cut 或其他任何东西持开放态度...:)

注意:可以有任意数量的错误代码(即 XX:XXXX,一行中感兴趣的模式)。

最佳答案

% awk 'BEGIN{RS=": "};NR>1{printf "%s%s", $1, ($0~/\n/)?"\n":" "}' input.txt 
EU-1C0A TM-0401
MG-7688 DN-0A00 DN-0A52 MG-3218
DN-0A00 DN-0A52
EU-1C0A MG-7688

详细解释:

awk '
BEGIN{ RS=": " } # Set the record separator to colon-space
NR>1 { # Ignore the first record
printf("%s%s", # Print two strings:
$1, # 1. first field of the record (`$1`)
($0~/\n/) ? "\n" : " ")
# Ternary expression, read as `if condition (thing
# between brackets), then thing after `?`, otherwise
# thing after `:`.
# So: If the record ($0) matches (`~`) newline (`\n`),
# then put a newline. Otherwise, put a space.
}
' input.txt

未修改问题的先前答案:

% awk 'BEGIN{RS=": "};NR>1{printf "%s%s", $1, (NR%2==1)?"\n":" "}' input.txt 
EU-1C0A TM-0401
MG-7688 MG-3218
DN-0A00 DN-0A52
EU-1C0A MG-7688

编辑: 防止:-注入(inject)(thx @e0k)。测试记录分隔符后的第一个字段是否符合我们的预期。

awk 'BEGIN{RS=": "};NR>1 && $1 ~ /^[A-Z]{2}-[A-Z0-9]{4}$/ {printf "%s%s", $1, ($0~/\n/)?"\n":" "}' input.txt

关于linux - 逐行读取并逐行打印匹配项,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/41067223/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com