打印文件而不添加带有awk的尾随换行符

打印文件而不添加带有awk的尾随换行符,awk,newline,cmp,Awk,Newline,Cmp,我正在使用awk处理一些程序文件,删除调试部分。其中一些文件没有尾随换行符。我想让awk一行一行地打印文件,带有换行符,但如果文件不存在,就不要在末尾添加额外的换行符 例如 正在变成这样: a b<NEWLINE> 我尝试用printf“%s”替换结尾处的print,$0。但是它会从每一行中省略一个换行符。您可以简单地使用这样一个事实,即awk在缺少换行符的情况下在末尾追加一个换行符,如下所示: { if ($0 ~ /^[ \t]*\/\/[ \t]*\/\*[

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

例如

正在变成这样:

a
b<NEWLINE>

我尝试用
printf“%s”替换结尾处的
print
,$0
。但是它会从每一行中省略一个换行符。

您可以简单地使用这样一个事实,即
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;
}
# 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
#假设file1结尾不包含换行符。自从
#如果缺少新行,awk将在末尾添加新行,file1\u debug
#将在末尾包含一个换行符。
awk-f remove_debug.awk file1>file1_debug
#在比较文件之前再次使用awk,这确保
#我们比较它们,两个文件的末尾都有一个换行符。

如果cmp--silent将
打印行
语句更改为
printf“%s%s”,行,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

为什么?结尾没有换行符的源代码文件被认为是不好的做法。@hek2mgl我个人也希望看到结尾有换行符,但Windows工具并不真正在意。@TomFenech至少git会抱怨这一点,在Windows上也是如此。顺便说一句,在Linux上,即使生成一个结尾没有换行符的文件,也是一个相当棘手的问题。:)@hek2mgl我同意源代码文件的结尾应该有一个换行符,但是如果忘记了和/或我们没有转换它们,我希望脚本仍然有效。BBEdit(在OSX上)默认情况下不会在末尾插入换行符,所以我不会说它需要“hack”。但是,它确实有一个“确保文件以换行结束”设置,这可能已经被检查过了。如果GNU awk使用
RT
输出与输入相同的终止符或缺少任何终止符
RT
是一项仅限于
gawk
的功能:很高兴知道有一种方法。太遗憾了,我没有使用GNU版本。谢谢,这是一个很好的解决方案。我试图用awk来解决这个问题,但从awk内部(标准)很难判断它是否以换行结束。
$ 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$