使用awk从文件中删除第一行和最后一行的最简单方法是什么?

时间:2013-04-06 22:26:27

标签: awk

我正在学习awk / gawk。所以最近我只是尝试解决它的任何问题,以获得更多的练习机会。

我的同事昨天问了一个问题,

  

“如何从文件中删除第一行和最后一行”

。我知道sed '1d;$d' file会起作用。即使性能不佳,head/tail也会起作用。我告诉他sed,他很开心。

后来,我试图写一个awk单行:到目前为止,我得到的是:

awk 'NR>1{a[++k]=$0}END{for(i=1;i<k;i++)print a[i]}'

这会将整个文件存储在数组中,只是为了跳过最后一行。我觉得应该有一种更简单(或更好)的方式来做这件事。

(如果没有更简单,更快或更好的方法,我会删除这个问题)

谢谢。

3 个答案:

答案 0 :(得分:48)

这就是诀窍:

awk 'NR>2 {print last} {last=$0}'
仅当NR&gt;时,

awk才会执行操作print last 2(即所有线路,但前2个)。在所有行上,它将变量last设置为当前行。因此,当awk读取第三行时,它会打印第2行(存储在last中)。当它读取最后一行(第n行)时,它会打印第n-1行的内容。净效果是打印第2行到第n-1行。

答案 1 :(得分:6)

让我建议另一个解决方案。 如果你需要为顶部和底部行定制N,你可以使用 tail head 命令:

awk '{print $1}'  | head -n -1 | tail -n+2

head -n -1 - 删除最后一行

tail -n + 2 - 从第二行开始输出(删除1行)

以下命令将从顶部和底部删除3行:

awk '{print $1}'  | head -n -3 | tail -n +4

实际上我们甚至不需要awk:

more | head -n -1 | tail -n +2

cat | head -n -1 | tail -n +2

感谢Igor Fobia发表评论!

答案 2 :(得分:2)

这是另一种方法,但是它需要gawk函数的长度:

public static int findCharInString(String input,char inputChar) {
    int counter=0;
    for (int i = 0; i < input.length(); i++) {
        if(input.charAt(i)==inputChar) {
            counter++;
        }
    }
    return counter;
}