从文件中打印每n行

时间:2015-01-08 09:45:31

标签: bash variables sed

我正在尝试从文件中打印每个n行,但n不是常量而是变量。

例如,我想用sed -n '1~5p'替换sed -n '1~${i}p'

这可能吗?

4 个答案:

答案 0 :(得分:7)

awk也可以更优雅的方式完成:

awk -v n=YOUR_NUM 'NR%n==1' file

使用-v n=YOUR_NUM表示号码。然后,NR%n==1在行号为7n+1的情况下评估为true,因此它会打印该行。

请注意使用awk对此有多好:如果您想要7n+k表单上的行,则只需执行:awk -v n=7 'NR%n==k' file

实施例

让我们每7行打印一次:

$ seq 50 | awk -v n=7 'NR%n==1'
1
8
15
22
29
36
43
50

sed

$ n=7
$ seq 50 | sed -n "1~$n p" # quote the expression, so that "$n" is expanded
1
8
15
22
29
36
43
50

答案 1 :(得分:7)

关键是,您应该使用双引号"而不是单引号来包装您的sed代码。变量不会在单引号内扩展。这样:

sed -n "1~${i} p"

答案 2 :(得分:1)

你可以这样做,例如:

i=3
sed "2,${i}s/.*/changed line/g" InputFile

示例:

AMD$ cat File
aaaaaaaaaaaaaaaaaaaaaaaa
bbbbbbbbbbbbbbbbbbbbbb
cccccccccccccccccccccc
ddddddddddddddddddddddd
eeeeeeeeeeeeeeeeeeeeeeee
fffffffffffffffffffff
ggggggggggggggggggggg

AMD$ i=4; sed "2,${i}s/.*/changed line/g" File
aaaaaaaaaaaaaaaaaaaaaaaa
changed line
changed line
changed line
eeeeeeeeeeeeeeeeeeeeeeee
fffffffffffffffffffff
ggggggggggggggggggggg

关键是使用" "进行变量替换。

答案 3 :(得分:0)

为什么选择sed?

head -${i} YourFile