fig*_*hai 10 awk text-processing
我有以下文件:
$ cat disk.out
disk0
fcs0
text
text
text
disk1
fcs1
text
text
text
text
...
Run Code Online (Sandbox Code Playgroud)
我想要实现的是匹配“磁盘”+“fcs”,然后在一行中打印一对,如下所示:
disk0,fcs0
disk1,fcs1
...
Run Code Online (Sandbox Code Playgroud)
所以我匹配“磁盘”和“fcs”awk并将输出记录分隔符更改为“,”。`
$ awk '/disk|fcs/' ORS="," disk.out
disk0,fcs0,disk1,fcs1,
Run Code Online (Sandbox Code Playgroud)
问题是,它将在一行上打印所有匹配项,并以,. 如何仅在一行中打印每个匹配项?像这样:
disk0,fcs0
disk1,fcs1
...
Run Code Online (Sandbox Code Playgroud)
小智 11
您必须保存“磁盘”行(不打印),直到找到下一个“fcs”行:
awk '/disk/{ DISK=$0; next } /fcs/{ print DISK "," $0 }'
Run Code Online (Sandbox Code Playgroud)
你的方法的问题是,它打印无论是线路匹配“磁盘”或“FCS”,而不结合这些行。
disk3
text
fcs3
Run Code Online (Sandbox Code Playgroud)
在这种情况下,我的脚本会很乐意打印“disk3,fcs3”。
Sun*_*eep 10
$ awk '/fcs/ && a ~ /disk/ {print a","$0} {a=$0}' disk.out
disk0,fcs0
disk1,fcs1
Run Code Online (Sandbox Code Playgroud)
string ~ /regexp/将检查正则表达式(这里是disk)是否匹配给定的字符串,a在这种情况下是可变的。该&&运营商在此用于两个条件结合起来,只有第一条件/fcs/和第二个条件a ~ /disk/都为真,打印将被执行。
如果它总是采用这种格式(一个磁盘一个 fcs,磁盘后总是 fcs),你可以不用awk:
grep -F -e disk -e fcs file | paste -d , - -
Run Code Online (Sandbox Code Playgroud)
或者:
awk '(/disk/ && ORS=",") || (/fcs/ && ORS=RS)' file
Run Code Online (Sandbox Code Playgroud)
尽管使用awk,您可能更喜欢 Martin 或 sp sic 给出的更清晰的方法。