我正在学习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]}'
这会将整个文件存储在数组中,只是为了跳过最后一行。我觉得应该有一种更简单(或更好)的方式来做这件事。
(如果没有更简单,更快或更好的方法,我会删除这个问题)
谢谢。答案 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;
}