【问题标题】:How I can print line every four lines [duplicate]我如何每四行打印一行[重复]
【发布时间】:2020-04-13 05:54:00
【问题描述】:

我有一个包含 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”)

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

【问题讨论】:

标签: awk csh


【解决方案1】:

使用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
}

【讨论】:

  • @David 但是当模数为 2 或 3 时也会打印。
  • 哦,你是对的——我知道那时咖啡已经用完了......我实际上认为你需要awk 'NR==1 || NR%4==0' 来匹配1, 4, 8, 12, 16, ... 这是一个你可以运行的快速测试@ 987654326@ 如果您不使用 bash,请使用 $(seq 1 20) 而不是 brace-expansion
  • 我说的原因是你现在匹配1, 5, 9, 13, ...
  • 缩小一点:awk 'NR%4==1' file。 awk 适用于 pattern { action } 对。如果写入模式,则默认操作为print $0
【解决方案2】:

如果你喜欢sed

sed -n '0~4p'

很有趣,这是man sed中显示的确切示例

'第一步~步骤' 此 GNU 扩展匹配以 line 开头的每个 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

【讨论】:

    【解决方案3】:

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

    即便如此,这还是有多个错误。赋值运算符后面不能有空格,需要引用sed脚本(否则它认为P是第一个文件名......或者我猜你实际上是指p)。

    但是,您需要循环文件 8000 次并在每次迭代中打印一行的想法也是有缺陷的。您可以告诉sed 每隔四行打印一个脚本,例如

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

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

    awk 'FNR%4==1' filename
    

    【讨论】:

    • 朋友不要让朋友使用csh,所以也许这是朝着正确方向迈出的一步。
    猜你喜欢
    • 1970-01-01
    • 2019-12-11
    • 2017-08-29
    • 2020-05-21
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2016-10-16
    • 1970-01-01
    相关资源
    最近更新 更多