如何在END之前检测awk中的最后一行

don*_*yor 9 shell awk line

我正在尝试将最后一行添加到我正在创建的文件中.如何在awk之前检测文件的最后一行END?我需要这样做,因为变量在END块中不起作用,所以我试图避免使用END.

awk ' { do some things..; add a new last line into file;}'
Run Code Online (Sandbox Code Playgroud)

以前END,我不想要这个:

awk 'END{print "something new" >> "newfile.txt"}'
Run Code Online (Sandbox Code Playgroud)

Bir*_*rei 10

一种选择是使用getline函数来处理文件.它1在成功,0文件结束和-1错误时返回.

awk '
    FNR == 1 {

        ## Process first line.
        print FNR ": " $0;

        while ( getline == 1 ) {
            ## Process from second to last line.
            print FNR ": " $0;
        }

        ## Here all lines have been processed.
        print "After last line";
    }
' infile
Run Code Online (Sandbox Code Playgroud)

假设infile有这样的数据:

one
two
three
four
five
Run Code Online (Sandbox Code Playgroud)

输出将是:

1: one                                                                                                                                                                                                                                       
2: two                                                                                                                                                                                                                                       
3: three
4: four
5: five
After last line
Run Code Online (Sandbox Code Playgroud)

  • 做得很好; 除非需要对第一行进行特殊处理,否则您可以重写循环以使用 `do { ... } while (getline == 1)`,在这种情况下,您不需要在之前的 `print` 语句环形。 (2认同)

Dmi*_*Ch. 8

您可以使用ENDFILE,它在之前执行END

$ awk 'END {print "end"} ENDFILE{print "last line"}'  /dev/null /dev/null
last line
last line
end
Run Code Online (Sandbox Code Playgroud)

ENDFILE 存在于最新版本的 awk(我认为 >4.0)中。


Aks*_*gde 6

$ cat file 
1
2
3
4
5
Run Code Online (Sandbox Code Playgroud)

通过两次读取同一文件(推荐)

$ awk 'FNR==NR{last++;next}{print $0, ((last==FNR)?"I am Last":"")}' file file
1
2
3
4
5 I am Last
Run Code Online (Sandbox Code Playgroud)

运用 getline

$ awk 'BEGIN{while((getline t < ARGV[1]) > 0)last++;close(ARGV[1])}{print $0, ((last==FNR)?"I am Last":"")}' file
1
2
3
4
5 I am Last
Run Code Online (Sandbox Code Playgroud)


Pra*_*lli 5

打印上一行。当前行为2时,打印行1,当前行为3时,打印行2。

awk '{
    if (NR>1) {
        # process str
        print str;
    }
    str=$0;
}
END {
    # process whatever needed before printing the last line and then print the last line.
    print str;
}'
Run Code Online (Sandbox Code Playgroud)