如何在bash中扩展表达式以使多个命令分隔;

时间:2019-02-27 11:32:35

标签: bash awk

让我们说我想在单行命令中创建file1.txt,file2.txt ... file9.txt,并在所有命令中都写入字符串“ TEST”。我不想用于循环。我想写一个表达式,将其扩展为:

echo "TEST" > file1.txt ; echo "TEST" > file2.txt ; ... ; echo "TEST" > file9.txt ;

如果我写echo "TEST" > file{0..9}.txt,它将不起作用,因为它只会在右侧扩展。对于每个单独的文件,是否可以以及如何使它与结尾的;一起重复整个命令?

4 个答案:

答案 0 :(得分:4)

使用awk,您可以轻松地做到这一点:

awk '{print "TEST" > $1; close($1)}' <(printf '%s\n' file{0..9}.txt)

或者,使用printf | xargs

printf '%s\n' file{0..9}.txt | xargs -I % bash -c 'echo "TEST" > "$1"' - %

awk解决方案是首选,因为它不会为每个文件生成bash

答案 1 :(得分:4)

要将相同的内容写入许多文件,可以使用tee命令。提供文件名作为参数,提供标准输入的内容,并丢弃输出:

$ tee <<<'TEST' file{1..9}.txt >/dev/null
$ more *| cat
::::::::::::::
file1.txt
::::::::::::::
TEST
::::::::::::::
file2.txt
::::::::::::::
TEST
::::::::::::::
file3.txt
::::::::::::::
TEST
::::::::::::::
file4.txt
::::::::::::::
TEST
::::::::::::::
file5.txt
::::::::::::::
TEST
::::::::::::::
file6.txt
::::::::::::::
TEST
::::::::::::::
file7.txt
::::::::::::::
TEST
::::::::::::::
file8.txt
::::::::::::::
TEST
::::::::::::::
file9.txt
::::::::::::::
TEST

答案 2 :(得分:0)

请您尝试以下。

awk 'BEGIN{while(++i<=10){close("file"count".txt");print "TEST" > "file"++count".txt"}}'


以上代码的解释: 以点的形式添加了以上代码的说明。

我们没有读取awk命令的任何输入。 BEGIN命令的awk部分将在将任何Input_file赋予awk之前执行。

然后在BEGIN部分中,我正在运行一个while循环,该循环从i=1的值一直到i=10的值。

内部循环中,我首先检查是否打开了名为filecount.txt的输出文件,然后将其关闭。由于我们仅制作10个输出文件,因此此时将不会出现错误,但是如果您要创建N个.txt输出文件,则可以避免出现错误“打开的文件太多”这个close

现在打印是我将字符串TEST打印到文件名file(字符串)count(一种变量,其值每次增加1的变量)的地方.txt (一个字符串)。

答案 3 :(得分:0)

使用 GNU并行,无循环且并行:

parallel 'echo TEST > file{}' ::: {1..9}