【问题标题】:How to awk through multiple files?如何遍历多个文件?
【发布时间】:2015-06-02 22:59:48
【问题描述】:

我有数百个带有数据的 .dat 文件,我想用命令 awk

awk 'NR % 513 == 99' data.0003.127.dat > data.0003.127.Ma.dat

我试着写一个类似的脚本文件

for i in {1 ... 9}; do
i=i*3
datafile = sprintf("data.%04d.127.dat",i)
outfile = sprintf("data.%04d.127.Ma.dat",i)
 awk 'NR % 513 == 99' datafile > outfile
done

我只需要0003 0006 0009 ...文件,但上面的脚本不能正常工作。错误说

bash: ./Ma_awk.sh: line 3: syntax error near unexpected token `('
bash: ./Ma_awk.sh: line 3: `datafile = sprintf("data.%04d.127.dat",i)'

接下来我该怎么办?我使用的是 ubuntu 14.04。

【问题讨论】:

  • 多个问题:不要在变量赋值周围使用空格,即删除= 前后的空格。此外,当您在bash 中引用变量时,您必须使用$ 符号,即"$datafile" 请注意,在处理文件名时使用双引号是明智的。然后sprintf 中不存在bash 使用printf 代替。 `datafile=$(printf "%04d" $i)
  • 算术需要使用((i=i*3)) 或一些等效的符号来完成。

标签: bash loops awk


【解决方案1】:

在 bash(自 v4 起)中,您可以编写带增量的序列表达式:

$ echo {3..27..3}
3 6 9 12 15 18 21 24 27

您还可以包含前导零,这将被保留:

$ echo {0003..0027..3}
0003 0006 0009 0012 0015 0018 0021 0024 0027

所以你可以使用以下内容:

for i in {0003..0027..3}; do
  awk 'NR % 513 == 99' "data.$i.127.dat" > "data.$i.127.Ma.dat"
done

【讨论】:

  • @etan: true 但 OP 声称拥有 Ubuntu 14.04
【解决方案2】:

您的代码存在多个问题,仅仅是因为它们是 bash 语法错误。

  1. 不要在变量赋值周围使用空格
  2. 大括号扩展看起来像{1..9}
  3. 通过=$() 表示法将标准输出捕获到变量中
  4. 使用美元符号$ 引用变量
  5. 特别是对于文件名,使用双引号 " 以确保参数被视为一个

现在我还没有考虑你的 awk 程序的实际有效性,但是修复 bash 语法错误看起来像下面这样

#!/usr/bin/env bash

for i in {1..9}; do
    datafile=$(printf "data.%04d.127.dat" $i)
    outfile=$(printf "data.%04d.127.Ma.dat" $i)
    awk 'NR % 513 == 99' "$datafile" > "$outfile"
done

这不会处理增量为 3 的正确迭代边界,但由于您没有指定上限,我将把它作为练习留给您

【讨论】:

  • 我想是for i in {3..27..3}
  • 你是对的,但他没有指定上限,这是他脚本的最后一个错误
  • 脚本有很多问题,但您没有凭空选择上限9;它就在那里。我只是说你忽略了将 i 乘以 3 的尝试。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2015-09-06
  • 2019-07-21
相关资源
最近更新 更多