我有多个包含多个不同行的文件。其中,我只对以特定模式开头的行感兴趣,例如:
USER1 Info> :FERRARI:RED,:LAMBORGHINI:ORANGE,:MASERATI:BLUE,...
在此示例中(如所示,带有空格)。
从这些行中,我只需要汽车的制造信息(没有颜色),因此输出应如下所示:
FERRARI, LAMBORGHINI and MASERATI
每个文件中的汽车品牌始终不同。在示例中,我输入了 3 个汽车的品牌,但在每个文件中它们可能会更少或更多。有没有一种简单的方法可以在 bash 或 python 中做到这一点?谢谢
答案1
提取两个冒号之间的每个单词(不包含逗号)
grep -oHnE ":[^,]*:" files* | awk 'BEGIN{FS=":"} {x=$1$2; a[x]=a[x]","$4} END{for(x in a) print a[x]}' | sed 's/^,//'
假设我们有文件 car_info.txt
cat car_info.txt
USER1 Info> :FERRARI:RED,:LAMBORGHINI:ORANGE,:MASERATI:BLUE
USER1 Info> :FERRARI:RED,:LAMBORGHINI:ORANGE
USER1 Info> :FERRARI:RED,:LAMBORGHINI:ORANGE,:MASERATI:BLUE
grep -oHnE ":[^,]*:" car_info.txt
car_info.txt:1::FERRARI:
car_info.txt:1::LAMBORGHINI:
car_info.txt:1::MASERATI:
car_info.txt:2::FERRARI:
car_info.txt:2::LAMBORGHINI:
car_info.txt:3::FERRARI:
car_info.txt:3::LAMBORGHINI:
car_info.txt:3::MASERATI:
grep
-o
仅打印匹配行的匹配部分-H
打印文件名-n
打印行号-E
支持扩展正则表达式
现在的策略是使具有相同内容的行filename:line
显示在一行中
awk 'BEGIN{FS=":"} {x=$1$2;a[x]=a[x]","$4} END{for(x in a) print a[x]}'
BEGIN{FS=":"}
将字段分隔符设置为:
x=$1$2
放入filename
并line
放入x
a
使用 key=创建一个键值x
,并将第四个字段添加到每行中的值中x
for(x in a) print a[x]
打印键值对的值a
sed 's/^,//'
用于,
从行首删除
答案2
awk -F':' /^USER1.\*Info/' {print $2" "$4" "$6}' < infile