如何提取文件的特定部分?

如何提取文件的特定部分?

我有多个包含多个不同行的文件。其中,我只对以特定模式开头的行感兴趣,例如:

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放入filenameline放入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

相关内容