File 是否可以合并bash和awk脚本文件?

File 是否可以合并bash和awk脚本文件?,file,bash,awk,File,Bash,Awk,我有一些bash脚本,从中获取变量的值,我希望在awk中使用这些值。 是否可能在bash中包含整个awk(就像bash脚本文件一样)文件,例如: #!/bin/sh var1=$1 source myawk.sh 和myawk.sh: print $1; Bash和awk是不同的语言,每种语言都有自己的同名解释器。您展示的小样本被剥离得太远,没有多大意义: 您已经将这两个文件都标记为shell脚本;一个使用shebang#/bin/sh和另一个使用扩展名.sh。显然,shell可以读取sh

我有一些bash脚本,从中获取变量的值,我希望在awk中使用这些值。 是否可能在bash中包含整个awk(就像bash脚本文件一样)文件,例如:

#!/bin/sh
 var1=$1
source myawk.sh
和myawk.sh:

print $1;

Bash和awk是不同的语言,每种语言都有自己的同名解释器。您展示的小样本被剥离得太远,没有多大意义:

  • 您已经将这两个文件都标记为shell脚本;一个使用shebang
    #/bin/sh
    和另一个使用扩展名
    .sh
    。显然,shell可以读取shell脚本,这样做的命令在BourneShell中被称为
    (或者在csh和bash中被称为
    source
  • shell脚本分配了一个变量,但您没有在任何地方使用它。你的意思是把它传给awk脚本吗
  • awk和shell脚本都使用$1,这对它们有不同的含义(在bash中,它来自命令行或
    set
    命令;在awk中,它来自解析的输入行) 这两种工具通常是同时使用的,因为shell更擅长组合单独的程序,而awk更擅长重新格式化表格或结构化文本。这是如此的普遍,以至于一种完整的语言进化来结合这些任务;Perl的根是shell、awk和sed的组合


    如果您只是想将一个变量从shell脚本传递到awk脚本中,请使用-v。手册页是您的朋友。

    首先,如果您正在编写bash,请不要使用
    #/bin/sh
    这将使您进入兼容模式,这仅在您为可移植性而编写时才是必要的(然后您必须遵守POSIX规范)

    现在,关于您的问题,您只需从bash脚本内部运行awk,如下所示:

    #!/bin/bash
    var1=$1
    awk -f myawk.sh
    
    #!/bin/env bash
    #Bash things start
     ...
    var1=$1
    #Bash things stop
    #Awk things start, 
    #may use pipes or variable to interact with bash 
    awk -v V1=var1 '
    #AWK program, can even include awk scripts here.
    '
    #Bash things
    

    我想您也应该使用.awk作为扩展名。

    或者,许多ppl会这样做:

    #!/bin/bash
    var1=$1
    awk -f myawk.sh
    
    #!/bin/env bash
    #Bash things start
     ...
    var1=$1
    #Bash things stop
    #Awk things start, 
    #may use pipes or variable to interact with bash 
    awk -v V1=var1 '
    #AWK program, can even include awk scripts here.
    '
    #Bash things
    
    我建议这里有Bruce Barnett的这一页:

    您也可以使用双引号来利用shell的提取功能,但这会让人困惑


    就我个人而言,我只是尽量避免在bash或awk中添加那些花哨的gnu,并使我的脚本与ksh+(n)awk兼容。

    作为一个硬核awk用户,我很快意识到,做以下事情确实是一个巨大的帮助:

  • 在my bashrc中定义和导出AWK_REPO变量
    #bashrc的内容

    导出AWK\u REPO=~/bin/AWK
  • 将我使用
    .AWK
    扩展名编写的每个AWK脚本都存储在那里
  • 然后,您可以从任何地方这样调用它:
    awk-f$awk\u REPO/myScript.awk$file

    甚至,使用Shebangs并将AWK_REPO添加到PATH(使用
    导出PATH=${AWK_REPO}:${PATH}

    myScript.awk$文件

  • 组合
    bash
    awk
    ?它现在被称为Perl:P,说真的,我不太确定你在问什么。。。你想干什么?。仅意味着对于当前目录,您可以使用绝对路径运行任何脚本/程序。不要混淆该命令。使用目录。;两者实际上都不是指当前目录!您将找到该命令。接受任何路径和目录。存在于任何目录中;但是不以/开头的路径名将从当前目录开始,所以。实际上是从自身.Dot中引用当前目录。始终表示当前目录,如果运行ls-la:您将收到:。对于当前目录,以及。。对于up目录。这是一个简单的观察。不。表示包含的目录。试试ls-di$PWD........//并比较inode编号。有一个。顺便说一句,MS-DOS实际上没有Unix风格。或而是模仿他们;它还具有每个设备的当前工作目录的概念。那时候情况就大不一样了。