【问题标题】:How to print a single line of an existing file within a nested for loop in bash? [closed]如何在bash的嵌套for循环中打印现有文件的一行? [关闭]
【发布时间】:2021-06-28 17:56:26
【问题描述】:

可能这是一个基本而简单的问题,但是我已经环顾了两天,我无法弄清楚解决它的方法。

给定以下两段工作代码:

#!/bin/bash

# First, I need to generate all even numbers for a list of n integers, in this example n=12

for number in 258 256 233 230 212 245 210 229 340 345 110 125; do
    for ((counter = 2; counter <= ${number}; counter += 2)); do
        printf "$counter\t" >> Even_numbers.txt
    done
    printf "\n" >> Even_numbers.txt
done


# Then, I need to print each of these lines into a different file with a specific directory structure, 
# that looks like the following one:

for i in 01 02 03; do
    mkdir "${i}"
    for j in panel1 panel2 panel3 panel4; do
        {
        mkdir "${i}/${j}"
        for dir in ${i}/${j}; do
            printf "# TEXT AAAAA\n" > "${i}/${j}/File_${i}_${j}.par"
            printf "# TEXT BBBBB\n" >> "${i}/${j}/File_${i}_${j}.par"
            # I need to print here a single line of the "Even_numbers.txt" file
            # for each of the File_${i}_${j}.par files
            # The 12 lines in the Even_numbers.txt file and the 12 .par files
            # are in the same order.
            printf "# TEXT CCCCC\n" >> "${i}/${j}/File_${i}_${j}.par"
        done
        }
    done
done

我需要在第二个代码块中生成的每个文件中打印一行“Even_numbers.txt”文件。问题是无论我做什么,我总是将整个文件内容写入每个输出,而不是我需要的行。 “Even_numbers.txt”文件的行数相同,并且这些行的排序顺序与随后在每个子目录中生成的文件的顺序相同。

非常感谢任何帮助。

谢谢,

【问题讨论】:

  • for dir in ${i}/${j} 的意义何在?你只循环一个目录。
  • 你不需要把do的正文放在{}里面
  • 一般来说,将&gt;&gt;outfile 放在个人echoprintf 的末尾是不好的形式。最好在外部范围内进行重定向,这样文件就不会一遍又一遍地打开和关闭。例如,您可以将 &gt;even_numbers.txt 放在文件中的第一个 done 之后,以重定向整个 for 循环的标准输出,而您根本不需要 &gt;&gt;even_numbers.txts。
  • even_numbers.txt 里面只有一行。您用 TAB 分隔数字,而不是换行符。
  • 另外,only mkdir -p "$i/$j" 并且没有任何单独的 mkdir "$i" 命令会更有效。请记住,运行外部命令会带来巨大的性能损失(与内置命令相比)——您正在执行 fork()execve(),然后进行链接/加载/等等。

标签: bash for-loop while-loop cut


【解决方案1】:

首先,您可以一次创建所有目录:

mkdir -p {01..03}/panel{1..4}

要在每个文件中放入一行,请将循环输入从Even_numbers.txt 重定向,并在循环内使用read 一次获取一行。

for i in 01 02 03; do
    for j in panel1 panel2 panel3 panel4; do
        parfile="${i}/${j}/File_${i}_${j}.par"
        read number
        printf "# TEXT AAAAA\n# TEXT BBBBB\n%s\n# TEXT CCCCC\n" "$number" > "$parfile"
    done
done < Even_numbers.txt

【讨论】:

  • 感谢您的帮助@Barmar。分两步生成目录和子目录的要点是我在 MacOS 中运行代码,并且名称存储在两个变量中,即使您指定 mkdir -p ${var1}/${var2},MacOS 也不能在一个步骤中很好地处理这两个变量。我已经根据示例重写了代码,用硬编码名称替换了两个变量,并在循环中包含了 read 命令,现在它可以正常工作了。再次感谢!!
猜你喜欢
  • 2019-02-27
  • 1970-01-01
  • 2015-10-21
  • 1970-01-01
  • 2020-09-04
  • 2023-04-01
  • 2012-09-14
  • 1970-01-01
  • 2021-10-10
相关资源
最近更新 更多