Head&在bash脚本中使用awk尾部

时间:2016-05-17 14:01:35

标签: bash awk gawk

我在这里提出了另一个关于awk的问题。

我必须使用脚本参数在bash脚本中使用awk命令。

我所要做的就是:头和头;尾部每个文件,在脚本arg中给出

示例:./ script.sh 5 3 sampledata *

(其中sampledata *是文件:sampledata,sampledata1,sampledata2 ....; 5 - 用于' head',3 - 用于' tail')。

我只有:

#!/bin/bash

awk -v h="$1" -v t="$2" 'NR<=h && NR>=t' "$3"

这只适用于来自采样数据*的第一个文件! ):

如何使其适用于来自samplingata *的每个文件? 谢谢你的帮助!

2 个答案:

答案 0 :(得分:3)

正如在逗号中指出的那样,您需要使用FNR而不是NR,但您还需要将其余参数传递给awk:

#!/bin/bash
h=$1
t=$2
shift 2 # Remove first two positional variables
awk -v h="$h" -v t="$t" 'FNR<=h && FNR>=t' "$@"

或使用切片:

#!/bin/bash
awk -v h="$1" -v t="$2" 'FNR<=h && FNR>=t' "${@:3}"

也可以用sed编写:

sed -n "${1},${2}p" "${@:3}"

将在$1$2之间打印行。

答案 1 :(得分:0)

我假设您想要前5行和最后3行文件。对于尾部,您需要从文件末尾开始计数。如果您只对几行感兴趣,可以按照以下方式进行操作(我使用3和2)

$ awk -v h=3 -v t=2 'function pr() {for(i=j;i<j+t;i++) print p[i%t];j=0}
                  NR!=FNR && FNR==1{pr()} 
                             FNR<=h;
                                   {p[j]=$0;j=(j+1)%t} 
                                END{pr()}' <(seq 10) <(seq 7)
1
2
3
9
10
1
2
3
6
7