Bash 如果与前一行匹配,则使用awk提取特定模式
我有以下文件:Bash 如果与前一行匹配,则使用awk提取特定模式,bash,awk,Bash,Awk,我有以下文件: [INFO] com.fasterxml.jackson.core:jackson-core ............. 2.10.4 -> 2.11.0 [INFO] com.fasterxml.jackson.core:jackson-databind ......... 2.10.4 -> 2.11.0 [INFO] com.fasterxml.jackson.dataformat:jackson-dataformat-avro ... [INFO]
[INFO] com.fasterxml.jackson.core:jackson-core ............. 2.10.4 -> 2.11.0
[INFO] com.fasterxml.jackson.core:jackson-databind ......... 2.10.4 -> 2.11.0
[INFO] com.fasterxml.jackson.dataformat:jackson-dataformat-avro ...
[INFO] 2.10.4 -> 2.11.0
[INFO] com.fasterxml.jackson.dataformat:jackson-dataformat-cbor ...
[INFO] 2.10.4 -> 2.11.0
最后我想说的是:
com.fasterxml.jackson.core:jackson-core@2.10.4 -> 2.11.0
com.fasterxml.jackson.core:jackson-databind@2.10.4 -> 2.11.0
com.fasterxml.jackson.dataformat:jackson-dataformat-avro@2.10.4 -> 2.11.0
com.fasterxml.jackson.dataformat:jackson-dataformat-cbor@2.10.4 -> 2.11.0
我怎样才能做到这一点
正在删除[信息]并替换。。。使用@非常简单,即
cat temp1 | sed "s/\[INFO\]//g" | sed "s/\s//g" | sed -E "s/\.\.+/@/"
其中包括:
com.fasterxml.jackson.core:jackson-core@2.10.4->2.11.0
com.fasterxml.jackson.core:jackson-databind@2.10.4->2.11.0
com.fasterxml.jackson.dataformat:jackson-dataformat-avro@
2.10.4->2.11.0
com.fasterxml.jackson.dataformat:jackson-dataformat-cbor@
2.10.4->2.11.0
然而,我不知道如何使用awk来获得带有->的所有行,但是如果该行没有。。。然后获取上一个+当前,否则仅获取当前
感谢使用
awk
解决OP的cat/sed/sed/sed
步骤后的“下一步”
出于测试目的:
$ cat com.data
com.fasterxml.jackson.core:jackson-core@2.10.4->2.11.0
com.fasterxml.jackson.core:jackson-databind@2.10.4->2.11.0
com.fasterxml.jackson.dataformat:jackson-dataformat-avro@
2.10.4->2.11.0
com.fasterxml.jackson.dataformat:jackson-dataformat-cbor@
2.10.4->2.11.0
一个awk
解决方案:
awk '
BEGIN { pfx="" } # initial printf prefix is empty string
/^com/ { printf "%s%s", pfx, $0 ; pfx="\n" ; next } # if line starts with "^com" then print prefix and current line
# set prefix to "\n" for rest of script
# skip to next line of input
{ printf "%s", $0 } # otherwise printf current line
END { printf "\n" } # print one last "\n" once done
' com.data
注意:删除对分离器代码的注释
上述情况产生:
com.fasterxml.jackson.core:jackson-core@2.10.4->2.11.0
com.fasterxml.jackson.core:jackson-databind@2.10.4->2.11.0
com.fasterxml.jackson.dataformat:jackson-dataformat-avro@2.10.4->2.11.0
com.fasterxml.jackson.dataformat:jackson-dataformat-cbor@2.10.4->2.11.0
OP应能够通过以下方式实现这一点:
cat temp1 | sed "s/\[INFO\]//g" | sed "s/\s//g" | sed -E "s/\.\.+/@/" | awk 'BEGIN ... '
就个人而言,我可能会放弃整个
cat/sed/sed/sed
块,转而使用单个awk
解决方案(例如,Ed的答案)。您使用了哪个示例?因为NF是字段数,在删除所有[INFO]之后。。。NF始终是1我需要一个通用的solution@Symeon如果您需要一个通用解决方案,请正确描述输入。这个脚本与您的示例配合得很好是的…您是对的…它只是用于起始文件。谢谢
cat temp1 | sed "s/\[INFO\]//g" | sed "s/\s//g" | sed -E "s/\.\.+/@/" | awk 'BEGIN ... '