UNIX awk:使用“CLICKS”打印行,如果*在pos 7跳过行,如果包含“\”concat next line,如果下一行有* concat第3行

时间:2017-10-04 14:09:25

标签: unix awk sed awk-formatting

我需要从包含“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

1 个答案:

答案 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()用于将前导数字和空格更改为单个空白字符,然后在保存行的末尾打印当前行。