【问题标题】:Unix: awk save values as variableUnix:awk 将值保存为变量
【发布时间】:2021-03-14 22:56:57
【问题描述】:

我的文件名带有几个下划线:

nc_glals_3_4.mrc 

然后我可以用 awk 读出值 3 和 4:

$ echo "nc_glals_3_4.mrc" | awk -F'[_.]' '{print$3$4}' 
34

但如果我喜欢将34 存储为变量并调用该变量,则不起作用:

$ variable=$("nc_glals_3_4.mrc" | awk -F'[_.]' '{print $3$4}')
-bash: nc_glals_3_4.mrc: command not found

$ variable="$("nc_glals_3_4.mrc" | awk -F'[_.]' '{print $3$4}')"
-bash: nc_glals_3_4.mrc: command not found

$ variable
-bash: variable: command not found

怎么了?

【问题讨论】:

  • variable=$(echo "nc_glals_3_4.mrc" | awk -F'[_.]' '{print $3$4}')
  • 您需要在$( . . . ) 内部使用echo,就像在外部一样。 Bash 正在尝试将您的字符串作为程序运行

标签: bash variables awk save


【解决方案1】:

正如你在命令行中使用echo一样,你也需要在子进程调用中使用echo,例如:

# wrong:

$ variable=$("nc_glals_3_4.mrc" | awk -F'[_.]' '{print $3$4}')

# right:

$ variable=$(echo "nc_glals_3_4.mrc" | awk -F'[_.]' '{print $3$4}')

# or using here string:

$ variable=$(awk -F'[_.]' '{print $3$4}' <<< "nc_glals_3_4.mrc")

然后再次使用echo显示变量的值:

$ echo "${variable}"
34

【讨论】:

    【解决方案2】:

    如果你想保留的数字总是在同一个位置:

    test@darkstar:~$ Filename="nc_glals_3_4.mrc"
    test@darkstar:~$ awk -F'[_.]' '{print$3$4}' <<< $Filename
    34
    test@darkstar:~$ Numbers=$(awk -F'[_.]' '{print$3$4}' <<< $Filename)
    test@darkstar:~$ echo $Numbers
    34
    test@darkstar:~$
    

    但是,如果数字并不总是在相同的位置,并且您想捕捉下划线之间或下划线和句号之间的所有数字,无论它们出现在哪里:

    Numbers=$(awk -F'[_.]' '{for (i=0;i<=NF;i++) {if ($i~/^[0-9]+$/) {printf("%i", $i)}}}' <<< $Filename)
    

    【讨论】:

      【解决方案3】:

      如果我理解你的问题:

      variable=$(echo "nc_glals_3_4.mrc" | awk -F'[_.]' '{print $3$4}')
      

      您的命令中需要一个回显....现在 '34' 已存储到变量中。

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2022-11-03
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多