每四行打印一行

时间:2019-12-20 18:40:51

标签: awk csh

我的文件包含8000行,我想打印1,4,8,12,...,7996行。

我尝试了这段代码

for j in {1 .. 8000}
do
k= $((4 * $j))
print k 
sed -n $k P test.dat >> test.dat1 
done

但出现此错误:

  

./ test.csh:第3行:4 * {1:语法错误:预期操作数(错误令牌为“ {1”)

问题是什么,我该怎么办?

3 个答案:

答案 0 :(得分:2)

使用awk命令:

awk 'NR%4==1{print}' input.txt

说明:

NR % 4 == 1 { # for every input line, which line number (NR) modulo 4 is 1
    print $0; # print the line
}

答案 1 :(得分:1)

如果您喜欢sed

sed -n '0~4p'

有趣的是,这是man sed

中显示的确切示例
  

“第一个步骤”        此GNU扩展名与以行开头的所有STEPth行匹配        第一。特别是,当存在        非负N,以使当前行号等于FIRST +(N        * 步)。因此,将使用“ 1〜2”来选择奇数        行,偶数行为“ 0〜2”;选择每三行        从第二个开始,将使用“ 2〜3”;每五分之一        从第十行开始,使用“ 10〜5”;而“ 50〜0”只是一个        晦涩的说“ 50”的方式。

 The following commands demonstrate the step address usage:

      $ seq 10 | sed -n '0~4p'
      4
      8

答案 2 :(得分:0)

即使您的问题被标记为,您似乎仍在尝试使用Bash语法。

即使如此,这仍然存在多个错误。赋值运算符后不能有空格,并且需要引用sed脚本(否则它认为P是第一个文件名...或者我猜你实际上是在说{{1 }}。

但是您需要将文件循环8000次并在每次迭代中打印出一行的想法也是有缺陷的。您可以告诉p使用单个脚本(如

)每四行打印一次
sed

不过,我会为此切换到Awk。

sed -n -e 1p -e 5p -e 9p ... filename