我需要从包含“CLICK”的文件中打印行,而不是像第000001行那样注释(*在第7位),
如果该行有CLICK和“\”然后连接下一行,如果下一行被注释,则跳过该行并连接下一行:如行号000002 concat,行000004跳过000003行。
如果连接线(下一个)也包含'\'那么我们不需要连接第3行,我的意思是我们从输出中删除行,就像我们删除了第3行和第5行,因为它们不是需要 如前所述的核心逻辑: [如果该行有CLICK和“\”(两者)然后连接下一行,如果只有CLICK打印该行,则从输出中删除所有其他行]。
所以在这种情况下的例子是: 000006 concats 000007但不会连接000008,这意味着000008将从输出中删除
输入文件:
000001 HECTOR CLICK MOUSE
000002 ANNE CLICK MOUSE \
000003* AND PRESSES KEYBOARD
000004 AND PRESS KEYBOARD
000005* CLARK CLICK MOUSE
000006 MIKE CLICK MOUSE \
000007 AND PRESS KEYBOARD \
000008 AND TAPS SCREEN
输出
000001 HECTOR CLICK MOUSE
000002 ANNE CLICK MOUSE \ AND PRESS KEYBOARD
000006 MIKE CLICK MOUSE \ AND PRESS KEYBOARD \
我创造了这个:
awk '
/^...... +/{
if ($0 ~ /CLICK/ && $0 ~ /\\/)
{l1=$0;getline; print l1 $0}
else if
($0 ~ /CLICK/ && $0 !~ /\\/)
{print $0} ;
}' *> outfile
结果非常接近但有两个问题:
1. the data is written twice
2. commented second line is also printed, i tried /^...... +/ inside the if but it gave error
答案 0 :(得分:2)
$ cat tst.awk
$1 ~ /\*$/ { next }
saved != "" {
sub(/^[^[:space:]]*[[:space:]]+/," ")
print saved $0
saved = ""
}
/CLICK/ {
if ( /\\$/ ) {
saved = $0
}
else {
print
}
}
$ awk -f tst.awk file
000001 HECTOR CLICK MOUSE
000002 ANNE CLICK MOUSE \ AND PRESS KEYBOARD
000006 MIKE CLICK MOUSE \ AND PRESS KEYBOARD \
略过每条评论专栏。对于每一行:当我们找到包含CLICK的行时,如果它以反斜杠结尾,则保存它,否则打印它。对于每一行,如果我们有一个保存的字符串,则将其打印在当前行的前面。 sub()用于将前导数字和空格更改为单个空白字符,然后在保存行的末尾打印当前行。