我在这里提出了另一个关于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 *的每个文件? 谢谢你的帮助!
答案 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