在shell脚本中使用paste命令

时间:2016-10-22 19:43:35

标签: shell unix paste

我有3个文本文件。我想阅读它们并将它们存储在不同的变量中,然后使用粘贴将它们连接起来并在控制台中打印它们。 我尝试了以下代码,但它引发了一个错误说

  

找不到文件

这是我的代码

#!/bin/sh
value_1=`cat file_1.txt`
value_2=`cat file_2.txt`
value_3 = paste $value_1 $value_2
echo "$value_3"

3 个答案:

答案 0 :(得分:3)

paste期望其参数是文件的名称,而不是文件的内容。使用bash,ksh或zsh,可以解决这个问题。替换:

paste $value_1 $value_2

使用:

paste <(echo "$value_1") <(echo "$value_2")

<(...)称为流程替换。它使得parens中命令的输出看起来像一个文件。

改进

如果我们不知道输出中的第一个字符,那么printfecho更可靠:

paste <(printf "%s" "$value_1") <(printf "%s" "$value_2")

实施例

让我们使用这两个测试文件:

$ cat file1
1
2
$ cat file2
a
b

现在,让我们将这些文件读入变量并将粘贴应用于这些变量:

$ value_1=$(cat file1); value_2=$(cat file2)
$ paste <(printf "%s" "$value_1") <(printf "%s" "$value_2")
1       a
2       b

或者,将输出保存在变量中:

$ value_3=$(paste <(printf "%s" "$value_1") <(printf "%s" "$value_2"))
$ echo "$value_3"
1       a
2       b

答案 1 :(得分:0)

#!/bin/sh
value_1=$(cat file_1.txt
value_2=$(cat file_2.txt)
value_3=$(echo $value_1 $value_2 | paste) # or value_3="$value1 $value2"
echo "$value_3"

注意:

  • shell中=周围不允许空格
  • 反引号
    `
    用于旧式命令

替代,例如

foo=`command`

建议使用foo=$(command)语法。 $()内的反斜杠处理不那么令人惊讶,$()更容易嵌套。

检查http://mywiki.wooledge.org/BashFAQ/082

答案 2 :(得分:0)

第三行应为

value_3=`paste file_1.txt file_2.txt`

你需要反引号,value_3后没有空格,不要使用变量作为参数,请使用文件名。

它说“找不到文件”的原因是因为value_3后面有空格被解释为要运行的命令。