【问题标题】:How to write lines of one file into individual files in their own directories?如何将一个文件的行写入自己目录中的单个文件?
【发布时间】:2019-10-08 01:58:49
【问题描述】:

我有一个脚本,我需要读取文件的每一行,并将这些行单独打印到它们自己的基于行号的子目录中。

我有一个名为 input.data 的文件,其中有一个我需要更改的数字并将该文件的副本放入如下目录:

输入数据:

60 13 44.375 3 500 1.8

大小.txt:

44.732
44.733
44.823
44.532

我需要取第三个 input.data,将其替换为 sizes.txt 的第 1 行,并将其放在名为 frame0001 的目录中,然后对 sizes.txt 文件的其余行执行相同操作,以便它以格式结束

frame0001/input.data
frame0002/input.data
frame0003/input.data

...

我尝试在 for 循环中使用 awk、grep 和 echo 的组合,但我不知道如何让 awk 将 NR 作为 awk 之外的变量的值。

我用过:

mkdir $(printf "frame%04i" $(seq 1 475))

制作目录frame0001-frame0475

然后我用了:

i=1; for file in frame*; do cp "input.data" $(printf "frame%04i/a.out" "$i"); i=$((i+1)); done

将 input.data 文件原样复制到每个目录中,但是手动编辑每个文件需要很长时间。我想自动化这个过程,以便能够读取 sizes.txt 文件,并更改每个目录中的 input.data 文件,或者先编辑 input.data 文件然后放置在每个目录中。

【问题讨论】:

    标签: bash for-loop awk grep printf


    【解决方案1】:
    #!/bin/env bash
    cnt=0
    while IFS= read -r size; do
        printf -v dir 'frame%04d' $(( ++cnt ))
        mkdir -p "$dir" &&
        awk -v size="$size" '{$3=size}1' input.data > "${dir}/input.data"
    done < sizes.txt
    

    【讨论】:

    • 非常感谢,这是将所有内容组合在一个循环中的最有见地的方法。我不知道你可以以这种方式使用 awk。
    • 我想知道您是否打算以某种方式从帽子中拉出一只兔子并在awk 中完成所有操作。但是读取循环和awk 替换似乎与其他任何事情一样合乎逻辑。
    • @DavidC.Rankin the mkdir 意味着它不能全部在 awk 中完成。我的意思是你可以从 awk 间接调用 mkdir 但是你会有一个像shell { awk { system { shell { mkdir }}}} 这样的调用树而不是shell { mkdir; awk } 所以这显然是错误的方法。不过,我可能考虑一下,如果需要进行更多的文本操作才能得出目录名称,但这里不是这种情况。
    • 好点。乍一看,这就是思维过程的“基本要素”。
    猜你喜欢
    • 2015-08-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2014-08-13
    • 2018-08-04
    相关资源
    最近更新 更多