首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >循环中的AWK,用于从单个文件中生成多个文件

循环中的AWK,用于从单个文件中生成多个文件
EN

Stack Overflow用户
提问于 2020-06-24 15:57:28
回答 4查看 166关注 0票数 1

下面的文件名为ABCD.vasp

代码语言:javascript
复制
# A B C D
1.000000
     13.85640621        0.00000000        0.00000000
      4.61880236       13.06394496        0.00000000
      0.00000000        0.00000000       45.25483322
A B C D
   32      32      32      32
Selective dynamics
Direct
      0.00000000        0.00000000        0.00000000 F F F
      0.00000000        0.00000000        0.12500000 F F T
      0.00000000        0.00000000        0.25000000 F F T
      0.00000000        0.00000000        0.37500000 F F T
      0.50000000        0.00000000        0.00000000 F F F
      0.50000000        0.00000000        0.12500000 F F T
      0.50000000        0.00000000        0.25000000 F F T
      0.50000000        0.00000000        0.37500000 F F T
      0.12500000        0.37500000        0.06250000 F F T
      0.12500000        0.37500000        0.18750000 F F T
      0.12500000        0.37500000        0.31250000 F F T  

我想对上述文件执行的操作:

我想要将第一列复制到一个名为test.vasp

  • Line number 10的新文件中,如果第三列是>=0.25,那么第一列应该按0.025增加,整行应该被追加到test1.vasp

  • Line编号10之后,如果第三列是<0.25,那么整行应该被附加到test1.vasp

  • Step-2和步骤-3,我想从0.025 to 0.25test1.vasp to test10.vasp

重复

我尝试了以下命令,但该命令不起作用:

代码语言:javascript
复制
for ((i=1;i<=10;i++));do
        outputfile=test"$i".vasp
        awk -v I=$i 'NR > 9 && $3+0 >= 0.25 {
        p = $1; p =($I * 0.025); sub(/[^ \t]+/, sprintf("%.8f", p)) } 1' $inputfile > $outputfile
done

请在awksed中提出解决方案。

EN

回答 4

Stack Overflow用户

回答已采纳

发布于 2020-06-24 17:38:55

您可以使用这个awk脚本。

代码语言:javascript
复制
cat incr.awk

NR <= 9 {
   s = s $0 ORS
   next
}
{
   r[++n] = $0
}
END {
   for (i=1; i<=10; i++) {
      fn = "test" i ".vasp"
      printf "%s", s > fn
      for (k=1; k<=n; ++k) {
         split(r[k], a)
         if (a[3] >= 0.25) {
            sub(/[^\t]+/, sprintf("%.8f", a[1] + .025), r[k])
         }
         print r[k] > fn
      }
      close(fn)
   }
}

然后将其运行为:

代码语言:javascript
复制
awk -f incr.awk file
票数 1
EN

Stack Overflow用户

发布于 2020-06-24 16:38:56

不要多次调用awk,只需为awk中的每一行写入多个输出文件,如下所示:

代码语言:javascript
复制
{
    c=0
    for (i=0.025; i<=0.25; i+=0.025) {
        print ...whatever... >> ("test" (++c) ".vasp")
    }
}
票数 1
EN

Stack Overflow用户

发布于 2020-06-24 17:28:23

对于数字部分,您可以这样做

代码语言:javascript
复制
$ awk 'NR>9{for(i=1;i<=10;i++)
              {f="test" i ".vasp";
               if($3>=0.25) $1=sprintf("%.8f",$1+0.25)
               print > f}}' file

会给

代码语言:javascript
复制
$ head *.vasp | column -t

==>         test1.vasp   <==
0.00000000  0.00000000   0.00000000  F  F  F
0.00000000  0.00000000   0.12500000  F  F  T
0.25000000  0.00000000   0.25000000  F  F  T
0.25000000  0.00000000   0.37500000  F  F  T
0.50000000  0.00000000   0.00000000  F  F  F
0.50000000  0.00000000   0.12500000  F  F  T
0.75000000  0.00000000   0.25000000  F  F  T
0.75000000  0.00000000   0.37500000  F  F  T
0.12500000  0.37500000   0.06250000  F  F  T
0.12500000  0.37500000   0.18750000  F  F  T
==>         test10.vasp  <==
0.00000000  0.00000000   0.00000000  F  F  F
0.00000000  0.00000000   0.12500000  F  F  T
2.50000000  0.00000000   0.25000000  F  F  T
2.50000000  0.00000000   0.37500000  F  F  T
0.50000000  0.00000000   0.00000000  F  F  F
0.50000000  0.00000000   0.12500000  F  F  T
3.00000000  0.00000000   0.25000000  F  F  T
3.00000000  0.00000000   0.37500000  F  F  T
0.12500000  0.37500000   0.06250000  F  F  T
0.12500000  0.37500000   0.18750000  F  F  T
==>         test2.vasp   <==
0.00000000  0.00000000   0.00000000  F  F  F
0.00000000  0.00000000   0.12500000  F  F  T
0.50000000  0.00000000   0.25000000  F  F  T
0.50000000  0.00000000   0.37500000  F  F  T
0.50000000  0.00000000   0.00000000  F  F  F
0.50000000  0.00000000   0.12500000  F  F  T
1.00000000  0.00000000   0.25000000  F  F  T
1.00000000  0.00000000   0.37500000  F  F  T
0.12500000  0.37500000   0.06250000  F  F  T
0.12500000  0.37500000   0.18750000  F  F  T
==>         test3.vasp   <==
0.00000000  0.00000000   0.00000000  F  F  F
0.00000000  0.00000000   0.12500000  F  F  T
0.75000000  0.00000000   0.25000000  F  F  T
0.75000000  0.00000000   0.37500000  F  F  T
0.50000000  0.00000000   0.00000000  F  F  F
0.50000000  0.00000000   0.12500000  F  F  T
1.25000000  0.00000000   0.25000000  F  F  T
1.25000000  0.00000000   0.37500000  F  F  T
0.12500000  0.37500000   0.06250000  F  F  T
0.12500000  0.37500000   0.18750000  F  F  T
票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/62559210

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档