使用awk

时间:2016-01-05 15:52:45

标签: awk newline cmp

我使用awk处理一些程序文件,删除调试部分。其中一些文件没有尾随换行符。我希望awk一行一行地打印文件,使用换行符,但如果不存在则不添加额外的换行符。

E.g。

a
b // no newline after the "b"

变成了这个:

a
b<NEWLINE>

我不想添加此换行符的原因是我尝试使用cmp --silent $file $file_without_debug_sections来确定是使用原始文件还是新文件。我关心 的原因是我试图限制编译器输出中具有调试扩展的文件数量。仅使用非调试版本,如果它不同,也可以清楚地说明哪些文件被更改了#34;删除调试部分&#34;过程

总而言之,我怎样才能让awk逐行浏览文件,但如果不存在换行符,最后还是不添加换行符?

我目前的代码如下:

{    
    if ($0 ~ /^[ \t]*\/\/[ \t]*\/\*[ \t]*begin[ \t]+debug[ \t]*$/) { 
        print "/* begin debug"; 
    } else if ($0 ~ /^[ \t]*\/\/[ \t]*end[\ t]+debug[\t ]*\*\/[ \t]*$/) { 
        print "end debug */";
    } else print;
}

我尝试用print替换最后的printf "%s", $0。但是它反而省略了每一行的换行符。

2 个答案:

答案 0 :(得分:1)

你可以简单地使用这样一个事实:awk如果遗漏了最后一个换行符,就像这样:

# Let's say file1 does not contain a newline at the end. Since
# awk will add a newline at the end if it is missing, file1_debug
# WILL contain a newline at the end.
awk -f remove_debug.awk file1 > file1_debug

# Use awk again before comparing the files, this makes sure that when
# we compare them, both files have a newline at the end.
if cmp --silent <(awk '1' file1) <(awk '1' file1_debug) ; then
    echo "The files are the same"
else
    echo "The files differ"
fi

答案 1 :(得分:1)

将您的print line语句更改为printf "%s%s", line, RT

例如

$ seq 3 > s3
$ head -c -1 s3 > s3nn                      # remove last newline
$ awk '$1=$1{printf "%s%s", $0, RT}' s3nn
1
2
3$ awk '$1=$1' s3nn
1
2
3
$ cat s3nn
1
2
3$
在你的情况下,

没有参数的print等于print $0